Spring Data JPAのsave()とsaveAndFlush()の違い

1. 概要

この短いチュートリアルでは、https://www.baeldung.com/the-persistence-layer-with-spring-data-jpa [ Spring Data JPA]。
これらの方法はどちらもエンティティをデータベースに保存するために使用されますが、いくつかの根本的な違いがあります。

2. サンプルアプリケーション

最初に、_ save()_メソッドと_ saveAndFlush()_メソッドの使用例を見てみましょう。 最初のステップとして、エンティティークラスを作成しましょう:
@Entity
public class Employee {

    @Id
    private Long id;
    private String name;

    // constructors
    // standard getters and setters
}
次に、_Employee_エンティティクラスに対するCRUD操作用のlink:/spring-data-repositories[JPAリポジトリ]を作成します。
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
}

3. _save()_メソッド

名前が示すように、https://www.baeldung.com/spring-data-crud-repository-save [_save()_]メソッドを使用すると、エンティティを* DBに保存できます*。 Spring Dataによって定義された_CrudRepository_インターフェースに属します。 使用方法を見てみましょう。
employeeRepository.save(new Employee(1L, "John"));
通常、Hibernateはメモリ内に永続可能な状態を保持します。 この状態を基になるDBに同期するプロセスは、フラッシュと呼ばれます。
_save()_メソッドを使用する場合、保存操作に関連付けられたデータは、_flush()_ * *または_commit()_メソッドの明示的な呼び出しが行われない限り、DBにフラッシュされません*。
HibernateのようなJPA実装を使用する場合、その特定の実装はフラッシュおよびコミット操作を管理します。
ここで留意しなければならないことの1つは、コミットせずに自分でデータをフラッシュすることにした場合、変更は外部からは見えないことですlink:/transaction-configuration- with-jpa-and-spring [transaction]このトランザクションでコミット呼び出しが行われるか、外部トランザクションの分離レベルが_READ_UNCOMMITTED_でない限り。

4. _saveAndFlush()_メソッド

_save()_とは異なり、_saveAndFlush()_メソッドは、実行中にすぐにデータをフラッシュします。*このメソッドは、Spring Data JPAの_JpaRepository_インターフェースに属します。 使い方は次のとおりです。
employeeRepository.saveAndFlush(new Employee(2L, "Alice"));
通常、このメソッドは、ビジネスロジックが保存された変更を、同じトランザクションの後でコミット前に読み込む必要がある場合に使用します。
たとえば、保存するエンティティのプロパティを予期するストアドプロシージャを実行する必要があるシナリオを想像してください。 この場合、変更がDBと同期しておらず、ストアドプロシージャが変更を認識していないため、_save()_メソッドは機能しません。 _saveAndFlush()_メソッドは、この種のシナリオに最適です。

5. 結論

この簡単な記事では、Spring Data JPAの_save()_メソッドと_saveAndFlush()_メソッドの違いに注目しました。
ほとんどの場合、_save()_メソッドを使用します。 ただし、特定のユースケースでは、_saveAndFlush()_メソッドも使用する必要がある場合があります。
いつものように、ここで説明した短い例はhttps://github.com/eugenp/tutorials/tree/master/persistence-modules/spring-data-jpa-2[Github上]にあります。