一尘不染

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

hibernate

我有以下代码:

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


阅读 253

收藏
2020-06-20

共1个答案

一尘不染

根据Eval 2.0 EvalJSR-000317持久性规范

3.3.2交易回滚

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

2020-06-20