JPA 的 commit() 方法是否使实体分离?

2022-09-04 20:07:13

我现在一直在搜索JPA实体生命周期。但是现在,关于实体生命循环有一些缺失点。我在一个stackoverflow帖子中找到了下面的图形,请记住,此图表已被投票。

JPA Entity Life Cycle

根据这个图,当我们持久化实体时,它变成了托管的。还行。没关系。当我们提交时,数据进入数据库。还行。没关系。但是图向我们展示了这个提交操作使实体分离!让我们看一下下面的伪代码。

entityManager.persist(entity);
transaction.commit(); // action completed and entity has become detached.(According to the diagram.)
entityManager.remove(entity); //Attention this step please .

在上一步(提交步骤)中。那么如何删除分离的对象呢?如果这个实体变得分离,我们都知道不可能管理一个分离的实体,因为它不再具有持久性上下文。

那么如何删除分离的对象呢?在这一点上,你能不能澄清一下?提前致谢!


答案 1

实体可以通过以下方式之一分离(可能还有更多方法):

  1. 当事务(在事务范围的持久性上下文中)提交时,由持久性上下文管理的实体将分离。

  2. 如果应用程序管理的持久性上下文已关闭,则所有托管实体都将分离。

  3. 使用清除方法

  4. 使用分离方法

  5. 反转

  6. 在扩展持久性上下文中,当删除有状态 Bean 时,所有托管实体都将分离。

我认为问题可能是应用程序托管,用户托管,扩展持久性上下文之间的差异。


答案 2

2件事:状态删除和分离是不同的:意味着实体仍然被管理,并将在刷新时触发持久性层的删除,意味着实体不再被管理,并且对其所做的更改不会报告给数据库。RemovedDetached

您的实体状态与 相关。 表示跟踪对其所做的所有更改,并将在刷新时在数据库上报告这些更改。entityManagerManagedEM

您必须了解,在事务之外报告对数据库的更改没有任何意义(仅支持对数据库的事务访问,并且仅在隔离级别中)。JPAREAD_COMMITED

在检索到实体的事务过期后跟踪实体上的更改是没有意义的,因为无法在事务之外更改数据库状态。EntityManager

这就是为什么 In 被设计为每个工作单元创建的原因(与持久性单元相反,即为整个应用程序创建一次的实体管理器工厂)。EntityManagerJPA

因此,它应该具有与事务相同的范围,并且应该在提交后立即发布(当您让容器为您管理entityManager生命周期时就是这种情况)。EntityManager

这也是不支持嵌套事务的原因。JPA


推荐