【问题标题】:Spring Hibernate Saves/Commits Transaction whithout invoking Save methodSpring Hibernate 在不调用 Save 方法的情况下保存/提交事务
【发布时间】:2015-01-23 00:41:51
【问题描述】:

我正在使用 JPA 的 Spring 和 Hibernate 实现。 在我的服务类中,我有一个方法如下。

@Override
public String myMethod(String arg) throws Exception {
 MyObject obj = fetchFromDB();

 // Some code to update object.

 if(isSuccess){
    myObject.saveAndFlush();
 }
 else{
    return failure;
 }
}

由于某些原因,即使没有保存对象,更改也会保存到数据库中。

【问题讨论】:

  • 我们可以看到您更新对象的部分吗?
  • 它就在 boolean if(success){ org.springframework.data.jpa.repository.JpaRepository.saveAndFlush(myObject);我看到在这种情况下,一旦你退出这个方法,更新查询就会被记录下来。
  • 而且更新很简单...没有保存引用或级联对象...myObject 是父对象...我直接保存。

标签: java spring hibernate


【解决方案1】:

当您从数据库中获取对象时,它附加到休眠会话。您对附加对象所做的每项更改都会保留下来,而无需在对象上显式调用save

引用the documentation

Hibernate 将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。

在您的情况下,如果可能,您应该对 isSuccess 块内的对象进行所有更新。

【讨论】:

    【解决方案2】:

    没有看到您的完整实现,我怀疑这是在保存,因为您的对象处于托管状态。

    来自documentation for Java EE 6

    托管实体实例具有持久标识并与持久上下文相关联。

    然后,当它继续到explain what that means...

    当与实体关联的事务提交时,持久实体的状态会同步到数据库。如果一个托管实体与另一个托管实体存在双向关系,则数据将根据关系的拥有方进行持久化。

    因此,如果您有一个托管实体(也就是说,您使用 EntityManager 找到它并且您没有调用 detach()),那么当您提交事务时,对实体的更改将被保留。

    【讨论】:

      猜你喜欢
      • 2019-07-06
      • 2015-11-09
      • 1970-01-01
      • 2013-06-15
      • 2019-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多