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

Mes*_*gan 10 java hibernate jpa

我一直在寻找JPA实体生命周期.但现在,有关实体生活的一些缺失点.我在stackoverflow帖子中发现了以下图形,请记住这个图表已被upvoted.

JPA实体生命周期

根据这个图,当我们坚持实体时,它变得受管理.好 .没问题 .提交时,数据会进入数据库.好 .没问题.但是图表显示了我们这个提交操作使得实体分离了!我们来看下面的伪代码.

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

在上一步(提交步骤).那么如何删除分离的对象呢?如果该实体变得分离,我们都知道管理分离的实体是不可能的,因为它不再与持久化上下文相关联.

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

Atu*_*tul 8

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

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

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

  3. 使用清晰的方法

  4. 使用分离方法

  5. 回滚

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

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


Gab*_*ica 5

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

您的实体状态与entityManager. Managed意味着EM跟踪对其所做的所有更改,并将在刷新时将它们报告在数据库上。

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

一旦检索实体的事务过期,跟踪实体上的更改就毫无意义,因为EntityManager无法在事务之外更改数据库状态。

这就是为什么 The EntityManagerinJPA被设计为为每个工作单元创建(与 persistenceUnit 相反,即为整个应用程序创建一次的entityManagerFactory)。

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

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