我有以下代码:
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,提示“实体未管理”。如果我将第三行改为.commit()而不是.rollback(),那么一切似乎都可以正常工作。
.commit()
.rollback()
这里发生了什么?我可以防止这种情况发生吗?
更新: @DataNucleus将我引向PersistenceContext。如何在代码中更改持久性上下文?
根据Eval 2.0 Eval的JSR-000317持久性规范:
3.3.2交易回滚 对于事务范围的上下文和扩展的持久性上下文, 事务回滚都会导致所有先前存在的托管实例和已删除实例[31]分离 。实例的状态将是事务回滚时的实例状态。事务回滚通常会导致持久性上下文在回滚时处于不一致状态。特别地,版本属性的状态和所生成的状态(例如,所生成的主键)可能不一致。因此,以前由持久性上下文管理的实例(包括在该事务中成为持久性的新实例)可能无法以与其他分离对象相同的方式重用- 例如,它们在传递给合并操作时可能会失败。[32]
对于事务范围的上下文和扩展的持久性上下文, 事务回滚都会导致所有先前存在的托管实例和已删除实例[31]分离 。实例的状态将是事务回滚时的实例状态。事务回滚通常会导致持久性上下文在回滚时处于不一致状态。特别地,版本属性的状态和所生成的状态(例如,所生成的主键)可能不一致。因此,以前由持久性上下文管理的实例(包括在该事务中成为持久性的新实例)可能无法以与其他分离对象相同的方式重用- 例如,它们在传递给合并操作时可能会失败。[32]