我一直在寻找JPA实体生命周期。 但现在,有关实体生活的一些缺失点。我在stackoverflow帖子中发现了以下图形,请记住这个图表已经被投票了。
根据这个图,当我们坚持实体时,它变得受管理。 好 。没问题 。 提交时,数据会进入数据库。好 。 没问题。 但是图表显示了我们这个提交操作使得实体分离了! 我们来看下面的伪代码。
entityManager.persist(entity);
transaction.commit(); // action completed and entity has become detached.(According to the diagram.)
entityManager.remove(entity); //Attention this step please .
在上一步骤(提交步骤)。那么如何删除分离的对象呢? 如果该实体变得分离,我们都知道不可能管理一个分离的实体,因为它不再与持久化上下文相关联。
那么如何删除分离的对象呢?你能在这点澄清一下吗? 提前谢谢!
答案 0 :(得分:8)
实体可以通过以下方式之一脱离(可能有更多方法):
当事务(在事务范围的持久化上下文中)提交时,由持久性上下文管理的实体将被分离。
如果关闭了应用程序管理的持久性上下文,则所有托管实体都将分离。
使用明确方法
使用分离方法
回滚
在删除有状态bean的扩展持久性上下文中,所有托管实体都将分离。
我认为问题可能是应用程序管理,用户管理,扩展持久性上下文之间的区别。
答案 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时,提交不会导致脱离。