我正在使用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;
}
}
由于某些原因,即使没有保存对象,更改也会保存到数据库。
答案 0 :(得分:1)
从数据库中获取对象时,附加到hibernate会话。您对附加对象所做的每个更改都是持久保存的,无需在对象上显式调用save
。
Hibernate将检测对处于持久状态的对象所做的任何更改,并在工作单元完成时将状态与数据库同步。
在您的情况下,如果可能,您应该对isSuccess
块内的对象进行所有更新。
答案 1 :(得分:1)
如果没有看到您的完整实现,我怀疑这是保存,因为您的对象处于托管状态。
来自documentation for Java EE 6:
托管实体实例具有持久性标识,并与持久性上下文相关联。
然后,当它继续explain what that means ...
当与实体关联的事务提交时,持久实体的状态将与数据库同步。如果被管实体与另一个被管实体处于双向关系,则数据将根据关系的拥有方持久保存。
因此,如果您有一个托管实体(意思是,您使用EntityManager
来查找它而您没有调用detach()
),那么当您提交事务时,将保留对该实体的更改。