当前位置: 首页 > 面试题库 >

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

莫选
2023-03-14
问题内容

我有以下代码:

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


问题答案:

根据Eval 2.0 Eval的JSR-000317持久性规范:

3.3.2交易回滚

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



 类似资料:
  • In this recipe we will see how we can rollback an application in OpenShift quickly without switching to an older version of the source code in SCM. Check application health status Run: $ oc get pods -

  • 问题内容: 我开始使用Spring Data JPA在Spring Boot应用程序上进行工作,以在用户和角色之间建立ManyToMany关系。 此关系在User类中定义如下: 我使用以下角色创建角色: 之后向用户分配角色失败: 引发以下异常(为便于阅读而设置格式): 但是,如果在创建关系之前保存了用户,则可以正常工作: 我不得不两次保存/更新用户似乎有些不合理。有什么方法可以在不先保存 用户的

  • 问题内容: “独立实体”是什么意思?在交易期间如何将托管实体转换为独立实体? 问题答案: 分离实体是状态不能由JPA提供程序反映的实体。 换句话说,如果您更改其状态(即通过setter方法),则这些更改将不会保存到基础数据库中,因为JPA提供程序不必“观察”此类实体。 如果实体E1是受管实体,则可以使其分离调用(非常合理的命名)方法。您还可以使用它将清除整个PersistenceContext并有

  • 我有一个java代码,我正在更新staff实体。我正在使用应用程序管理的实体管理器。我在登录页面中有一个条件,如果用户提供了正确的用户名/密码,他的上次登录时间将被更新。 但是更新没有发生,我得到一个实体已被分离的异常。请参阅下面的代码:- staffDAOImpl.java:- 在StaffServiceImpl.java类中,您将看到我通过调用“StaffDAO.findUnique(logi

  • 问题内容: 我正在使用Spring Boot并通过jpahibernate。我正在使用JpaRepository接口来实现我的存储库。与以下UserRepository一样 我想实现以下目标 加载用户实体。 更改实体对象的状态,例如user.setName(“ foo”) 进行外部系统Web服务调用。将通话结果保存到数据库中 仅在成功响应此Web服务调用后,才将用户的新状态保存在存储库中。 以上所

  • 我正在JPA上使用spring boot和hibernate。我正在使用JpaRepository接口来实现我的存储库。与下面的UserRepository一样 我想实现以下目标 加载用户实体。 更改实体对象的状态,例如user.setname(“foo”) 执行外部系统webservice调用。将调用结果保存在DB中 仅当成功响应此webservice调用时,才将用户的新状态保存在存储库中。 以