Spring Data JPA中的save()和saveAndFlush()之间的区别

Difference Between save() and saveAndFlush() in Spring Data JPA

1.概述

在这个简短的教程中,我们将讨论Spring Data JPA中save()和saveAndFlush()方法之间的区别。

即使这两种方法都用于将实体保存到数据库中,也存在一些根本差异。

2.示例应用

让我们首先来看一个示例如何使用save()和saveAndFlush()方法。首先,我们创建一个实体类:

1
2
3
4
5
6
7
8
9
10
@Entity
public class Employee {

    @Id
    private Long id;
    private String name;
   
    // constructors
    // standard getters and setters
}

接下来,让我们为Employee实体类上的CRUD操作创建一个JPA存储库:

1
2
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

3. save()方法

顾名思义,save()方法允许我们将实体保存到数据库。它属于Spring Data定义的CrudRepository接口。让我们看看如何使用它:

1
employeeRepository.save(new Employee(1L,"John"));

通常,Hibernate将持久状态保存在内存中。将此状态同步到基础DB的过程称为刷新。

当我们使用save()方法时,除非并且直到对flush()或commit()方法进行了显式调用,否则与save操作关联的数据将不会刷新到DB。

如果我们使用像Hibernate这样的JPA实现,那么该特定实现将管理刷新和提交操作。

我们必须记住的一件事是,如果我们决定不提交而自行刷新数据,那么外部事务将看不到更改,除非在此事务或隔离级别中进行了提交调用外部交易记录为READ_UNCOMMITTED。

4. saveAndFlush()方法

与save()不同,saveAndFlush()方法在执行期间立即刷新数据。该方法属于Spring Data JPA的JpaRepository接口。这是我们的用法:

1
employeeRepository.saveAndFlush(new Employee(2L,"Alice"));

通常,当我们的业务逻辑需要在同一事务中稍后但在提交之前读取保存的更改时,我们使用此方法。

例如,假设有一个场景,我们必须执行一个存储过程,该存储过程需要一个我们要保存的实体属性。在这种情况下,由于更改与数据库不同步并且存储过程也不知道更改,因此save()方法将不起作用。 saveAndFlush()方法非常适合这种情况。

5.结论

在这篇快速文章中,我们重点介绍了Spring Data JPA save()和saveAndFlush()方法之间的区别。

在大多数情况下,我们将使用save()方法。但是有时,对于特定的用例,我们可能还需要使用saveAndFlush()方法。

像往常一样,我们在这里讨论的简短示例可以在Github上找到。