1. 概要

このクイックチュートリアルでは、 Spring Data JPAsave()メソッドと saveAndFlush()メソッドの違いについて説明します。

エンティティをデータベースに保存するためにこれらの方法の両方を使用していますが、いくつかの基本的な違いがあります。

2. アプリケーション例

まず、 save()メソッドと saveAndFlush()メソッドの使用方法を例を挙げて見てみましょう。 まず、エンティティクラスを作成します。

@Entity
public class Employee {

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

次に、 EmployeeentityクラスでのCRUD操作用のJPAリポジトリを作成します。

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

3. save()メソッド

名前が示すように、 save()メソッドを使用すると、エンティティをDB保存できます。 これは、SpringDataによって定義されたCrudRepositoryインターフェースに属しています。 それをどのように使用できるか見てみましょう:

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

通常、Hibernateは永続化可能な状態をメモリに保持します。 この状態を基盤となるDBに同期するプロセスは、フラッシングと呼ばれます。

save()メソッドを使用する場合、 save操作に関連付けられたデータは、flush() [ またはcommit()メソッドが作成されます

HibernateのようなJPA実装を使用する場合、その特定の実装がフラッシュおよびコミット操作を管理します。

ここで注意しなければならないことの1つは、データをコミットせずに自分でフラッシュすることにした場合、コミット呼び出しが行われない限り、変更は外部トランザクションに表示されないということです。このトランザクションまたは外部トランザクションの分離レベルはREAD_UNCOMMITTEDです。

4. saveAndFlush()メソッド

ようではない保存() saveAndFlush() 方法実行中にすぐにデータをフラッシュします。 このメソッドはに属します JpaRepository SpringDataJPAのインターフェース。 使用方法は次のとおりです。

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

通常、このメソッドは、ビジネスロジックが、同じトランザクションの後で、コミットの前に、保存された変更を読み取る必要がある場合に使用します。

たとえば、保存しようとしているエンティティのプロパティを期待するストアドプロシージャを実行する必要があるシナリオを想像してみてください。 この場合、 save()メソッドは機能しません。これは、変更がDBと同期しておらず、ストアドプロシージャが変更を認識していないためです。 saveAndFlush()メソッドは、この種のシナリオに完全に適しています。

5. 結論

この簡単な記事では、Spring Data JPA save()メソッドと saveAndFlush()メソッドの違いに焦点を当てました。

ほとんどの場合、 save()メソッドを使用します。 ただし、特定のユースケースでは、 saveAndFlush()メソッドも使用する必要がある場合があります。

いつものように、ここで説明した例は、GitHubにあります。