JPA查找方法持久化数据

时间:2015-09-22 14:06:19

标签: java spring hibernate jpa spring-data

我正在使用spring jpa。我已经使用

实现了事务管理
@org.springframework.transaction.annotation.Transactional

最近我注意到,虽然在某些情况下交易管理工作正常,但在其他情况下则不然。例如,我在服务方法中有这段代码,由guardianService.save(newFather); parentsSet.add(newFather); Guardian oldMother = guardianService.findById(motherId); 注释。  方法中的代码

guardianService.findById(motherId)

在上述情况下,数据库中的数据不会持续到第3行。一旦应用程序完成执行第3行,即使应用程序在第3行之后生成异常,newFather的数据也会被引用到数据库。

@Override public Guardian findById(long guardianId) { return guardianRepository.findByGuardianId(guardianId); }

的代码段
public interface GuardianRepository extends JpaRepository<Guardian, Long> {

Guardian findByGuardianId(long id);
}

内部GuardianRepository

guardianService.save(newFather);

@Override @Transactional public Guardian save(Guardian guardian) { return guardianRepository.save(guardian); }

的代码段
find()

所以我的问题是flush()方法是否以某种方式调用commit()Math.max(n, Coin(n / 2) + Coin(n / 3) + Coin(n / 4))

1 个答案:

答案 0 :(得分:4)

find()方法实际上会调用flush方法。默认情况下,在JPA中,FlushModeType设置为AUTO,这意味着如果发生对数据库的查询,则数据库中的数据必须是当前事务的最新数据。根据定义:

  

在事务中执行查询时,如果是FlushModeType.AUTO   在Query对象上设置,或者如果为flush的刷新模式设置   持久性上下文是AUTO(默认值)和刷新模式设置   没有为Query对象指定,持久性提供程序是   负责确保所有实体状态的所有更新   在持久性上下文中可能会影响结果   对查询的处理可以看到查询。