entityManager.getTransaction()。rollback()分离实体?

时间:2011-07-19 06:43:23

标签: java hibernate jpa persistence entitymanager

我有以下代码:

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test")
EntityManager entityManager = emf.createEntityManager()
User user = entityManager.find(User.class, 0);
entityManager.getTransaction().begin();
entityManager.getTransaction().rollback();
entityManager.refresh(user);

这会在第四行抛出IllegalArgumentException,说“Entity not managed”。如果我将第三行更改为.commit()而不是.rollback(),则一切似乎都正常。

这里发生了什么?我可以防止这种情况发生吗?

更新: @DataNucleus正在引导我走向PersistenceContext。如何更改代码中的持久性上下文?

2 个答案:

答案 0 :(得分:7)

来自JSR-000317 Persistence Specification for Eval 2.0 Eval

  

3.3.2交易回滚

     

对于事务范围和扩展持久性上下文,事务回滚会导致所有预先存在的托管实例和已删除的实例   [31]    脱离。实例的状态将是   事务回滚时的实例状态。通常是事务回滚   导致持久性上下文在回滚时处于不一致状态。特别是   版本属性和生成的状态(例如,生成的主键)可能不一致。   以前由持久性上下文管理的实例(包括新的实例)   因此,在该交易中持久化)可能无法以与其他分离相同的方式重复使用   对象 - 例如,它们可能在传递给合并操作时失败。   [32]

答案 1 :(得分:3)

在“事务”的PersistenceContext中,commit / rollback将分离事务中使用的对象。在“扩展”的PersistenceContext中,然后提交/回滚不执行任何操作,并且在EM的关闭处分离对象。取决于您的背景