【问题标题】:Does EntityManager remove() cause detachmentEntityManager remove() 是否导致分离
【发布时间】:2018-03-10 18:17:13
【问题描述】:

调用EntityManager.remove(someEntity) - 对于事务范围的实体管理器以外的其他实体 - 是否会导致实体被分离?当我阅读 JSR-317 时:

一个分离的实体是由事务提交产生的​​,如果一个 使用事务范围的容器管理实体管理器(参见 第 3.3 节);从事务回滚(见第 3.3.2 节);从 从持久化上下文中分离实体;从清除 持久性上下文;关闭实体经理;或从 序列化实体或以其他方式按值传递实体 - 例如, 一个单独的应用层,通过远程接口等。

它没有提到remove() 导致实体被分离,尽管其他网站提到了它。请提供您的答案的参考。

【问题讨论】:

    标签: jpa


    【解决方案1】:

    根据JPA 2.1 specification3.2.3 删除节,PDF 第 82 页),我们发现了一条与您的问题相关的重要信息:

    实体被移除后,其状态(生成状态除外)将是实体在该点的状态 remove 操作被调用

    所以,答案似乎是: 这取决于

    然而,在第 80 页,我们发现了另一条重要信息。

    删除的实体实例是具有持久身份的实例,与持久性上下文相关联,将在事务提交时从数据库中删除。

    因此,我们可以推断它没有处于分离状态,因为它仍然是“关联的”,直到最终被 TX 提交删除。

    深入挖掘,您可以参考Vlad Mihalcea 的答案中提供的JPA lifecycle image,以“更好地理解 JPA 状态转换”。如第一张图片 (JPA) 所示,实体不会转换到 detached 状态,而是最终处于 removed 状态。

    有关 remove(..) 操作语义的更多详细信息,请参见 JPA 规范文档的第 81/82 页。

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2016-11-05
      • 2013-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多