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

mem*_*und 6 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;
}
Run Code Online (Sandbox Code Playgroud)

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

Ala*_*Hay 9

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

从JPA规范:

3.4.5 OptimisticLockException提供程序实现可以推迟写入数据库直到事务结束,这与锁定模式和刷新模式设置一致.在这种情况下,在提交时间之前可能不会发生乐观锁定检查,并且可能在提交的"完成前"阶段抛出OptimisticLockException.如果必须由应用程序捕获或处理OptimisticLockException,则应用程序应使用flush方法来强制进行数据库写入.这将允许应用程序捕获和处理乐观锁定异常

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


Ali*_*ani 4

根据Spring Data 的 JavadocsaveAndFlush

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

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