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