Spring Hibernate在不调用Save方法的情况下保存/提交事务

时间:2015-01-23 00:41:51

标签: java spring hibernate

我正在使用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;
 }
}

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

2 个答案:

答案 0 :(得分:1)

从数据库中获取对象时,附加到hibernate会话。您对附加对象所做的每个更改都是持久保存的,无需在对象上显式调用save

来自the documentation

  

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

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

答案 1 :(得分:1)

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

来自documentation for Java EE 6

  

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

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

  

当与实体关联的事务提交时,持久实体的状态将与数据库同步。如果被管实体与另一个被管实体处于双向关系,则数据将根据关系的拥有方持久保存。

因此,如果您有一个托管实体(意思是,您使用EntityManager来查找它而您没有调用detach()),那么当您提交事务时,将保留对该实体的更改。