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

时间:2015-08-12 12:14:19

标签: java hibernate jpa

我一直在寻找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 .

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

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

4 个答案:

答案 0 :(得分:8)

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

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

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

  3. 使用明确方法

  4. 使用分离方法

  5. 回滚

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

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

答案 1 :(得分:3)

这张照片来自openjpa,但IMO(欢迎其他意见)有点不对劲?! (在EE中使用TRANSACTION Scope可以) 但在这样的JAVA SE示例中:     ....

EntityTransaction et = em.getTransaction();
et.begin();
em.persist(entity);
et.commit();
System.out.println(em.contains(entity)); // true
em.detach(entity);
System.out.println(em.contains(entity)); // false
entity = em.merge(entity);
System.out.println(em.contains(entity)); // true

在分离方法之后分离实体。提交后,它将保留在实体持久性上下文中。

对于您的问题:当您有一个分离的对象时,您可以使用merge将其重新连接到持久性上下文。

答案 2 :(得分:3)

2件事: 状态remove和detached是不同的:Removed表示实体仍处于管理状态,并且会在flush上的persitence层触发删除,Detached意味着不再管理实体并且所做的更改它不会被报告给数据库。

您的实体状态与entityManager相关。 Managed表示EM跟踪对其进行的所有更改,并在刷新时将其报告在数据库中。

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

一旦检索到的事务已过期,跟踪实体的更改就没有任何意义,因为EntityManager将无法在事务之外更改数据库状态。

这就是EntityManager中的JPA被设计为为每个工作单元创建的原因(与persistenceUnit相反,即为整个应用程序创建一次的entityManagerFactory)。

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

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

答案 3 :(得分:1)

JPA规范:

3.3 Persistence Context Lifetime and Synchronization Type
...
An EntityManager with an extended persistence context maintains its references to the entity objects
after a transaction has committed. Those objects remain managed by the EntityManager, and they can
be updated as managed objects between transactions.
...
3.3.2 Transaction Commit
The managed entities of a transaction-scoped persistence context become detached when the transaction
commits; the managed entities of an extended persistence context remain managed.

请注意,应用程序管理的实体管理器(通常在Java SE中将使用它)始终使用扩展的持久性上下文。

因此,您的问题的简短答案是:使用事务范围的PC时,提交将导致脱离;使用扩展PC时,提交不会导致脱离。