我有以下代码:
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。如何更改代码中的持久性上下文?
答案 0 :(得分:7)
来自JSR-000317 Persistence Specification for Eval 2.0 Eval:
3.3.2交易回滚
对于事务范围和扩展持久性上下文,事务回滚会导致所有预先存在的托管实例和已删除的实例 [31] 脱离。实例的状态将是 事务回滚时的实例状态。通常是事务回滚 导致持久性上下文在回滚时处于不一致状态。特别是 版本属性和生成的状态(例如,生成的主键)可能不一致。 以前由持久性上下文管理的实例(包括新的实例) 因此,在该交易中持久化)可能无法以与其他分离相同的方式重复使用 对象 - 例如,它们可能在传递给合并操作时失败。 [32]
答案 1 :(得分:3)
在“事务”的PersistenceContext中,commit / rollback将分离事务中使用的对象。在“扩展”的PersistenceContext中,然后提交/回滚不执行任何操作,并且在EM的关闭处分离对象。取决于您的背景