什么时候在弹簧SimpleJpaRepository中使用saveAndFlush?

时间:2014-12-11 11:24:08

标签: java spring jpa spring-data spring-data-jpa

我正在使用spring-data-jpa interface CrudRepository在每日批量导入中保存数据库中的大型数据集。

@Bean
public ItemWriter<MyEntity> jpaItemWriter() {
    RepositoryItemWriter<MyEntity> writer = new RepositoryItemWriter<>();
    writer.setRepository(repository);
    writer.setMethodName("save");
    return writer;
}

此接口的默认实现是SimpleJpaRepository,它提供saveAndFlush()方法。那个有什么用?如果我运行此方法而不是save(),这种方法对我来说是否有帮助,例如关于性能?

2 个答案:

答案 0 :(得分:8)

一个例子是,如果您使用乐观锁定并希望显式捕获OptimisticLockException并将其抛回客户端。如果更改仅在事务提交时刷新到数据库(即,当您的事务方法返回时),则不能这样做。从事务方法中清除漏洞可以捕获并重新抛出/处理。

来自JPA规范:

  3.4.5 OptimisticLockException提供程序实现可以推迟写入数据库,直到事务结束时为止   与锁定模式和冲洗模式设置一致有效。在   在这种情况下,在提交时间之前可能不会发生乐观锁定检查,   并且可以在“之前”抛出OptimisticLockException   完成“提交阶段。如果必须使用OptimisticLockException   被应用程序捕获或处理时,应该使用flush方法   应用程序用来强制数据库写入发生。这个   将允许应用程序捕获并处理乐观锁定   例外

因此,在回答您的问题时,它与性能无关,但可能存在您希望从事务方法中显式刷新数据库的情况。

答案 1 :(得分:3)

根据Spring Data's JavadocsaveAndFlush

  

保存实体并立即刷新更改。

如果使用save方法,它会在基础事务提交时刷新更改。