【问题标题】:entityManager.getTransaction().rollback() detaches entities?entityManager.getTransaction().rollback() 分离实体?
【发布时间】:2011-10-08 06:20:40
【问题描述】:

我有以下代码:

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

【问题讨论】:

    标签: java hibernate jpa persistence entitymanager


    【解决方案1】:

    来自JSR-000317 Persistence Specification for Eval 2.0 Eval

    3.3.2 事务回滚

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

    【讨论】:

      【解决方案2】:

      在“事务”的 PersistenceContext 中,提交/回滚将分离事务中使用的对象。在“扩展”的 PersistenceContext 中,提交/回滚不做类似的事情,并且对象在 EM 关闭时分离。取决于你的上下文

      【讨论】:

      • 你能详细说明一下吗?如何更改持久性上下文?
      • 那么 JPA 规范(第 3.3 节)将是一个很好的阅读,但 datanucleus.org/products/accessplatform_3_0/jpa/… 在 DataNucleus 中,我们提供了一个持久性属性以允许用户选择。在标准 JPA 中,对于 JSE 使用默认为“扩展”,对于 JEE 使用默认为“事务”。 Hibernate 允许什么,不知道
      • @DataNucleus 在 JPA 2.0 Spec 中,据说回滚会导致事务范围和扩展持久性上下文的托管实体分离,检查 ch。 3.3.2download.oracle.com/otn-pub/jcp/persistence-2.0-fr-oth-JSpec/…
      猜你喜欢
      • 2015-08-10
      • 2012-01-16
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 2018-10-25
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多