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

我有以下代码:

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。 如何更改代码中的持久性上下文?

来自Eval 2.0 Eval的JSR-000317持久性规范 :

3.3.2事务回滚

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

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