最新の安定バージョンについては、Spring Data JPA 3.3.1 を使用してください!

永続化エンティティ

このセクションでは、Spring Data JPA でエンティティを永続化(保存)する方法について説明します。

エンティティの保存

エンティティの保存は、CrudRepository.save(…) メソッドを使用して実行できます。基礎となる JPA EntityManager を使用して、指定されたエンティティを永続化またはマージします。エンティティがまだ永続化されていない場合、Spring Data JPA は entityManager.persist(…) メソッドの呼び出しでエンティティを保存します。それ以外の場合は、entityManager.merge(…) メソッドを呼び出します。

エンティティ状態検出戦略

Spring Data JPA は、エンティティが新しいかどうかを検出するために次の戦略を提供します。

  1. Version-Property および Id-Property インスペクション(デフォルト): デフォルトでは、Spring Data JPA は、非プリミティブ型のバージョンプロパティがあるかどうかを最初にインスペクションします。存在する場合、そのプロパティの値が null であれば、エンティティは新しいと見なされます。このようなバージョンプロパティがない場合、Spring Data JPA は指定されたエンティティの識別子プロパティをインスペクションします。識別子プロパティが null の場合、エンティティは新しいものと見なされます。それ以外の場合は、新しいものではないと見なされます。

  2. Persistable の実装: エンティティが Persistable を実装している場合、Spring Data JPA は新しい検出をエンティティの isNew(…) メソッドに委譲します。詳細については、JavaDoc (Javadoc) を参照してください。

  3. EntityInformation の実装: JpaRepositoryFactory のサブクラスを作成し、それに応じて getEntityInformation(…) メソッドをオーバーライドすることにより、SimpleJpaRepository 実装で使用される EntityInformation 抽象化をカスタマイズできます。次に、JpaRepositoryFactory のカスタム実装を Spring Bean として登録する必要があります。これはほとんど必要ないことに注意してください。詳細については、JavaDoc (Javadoc) を参照してください。

オプション 1 は、手動で割り当てられた識別子を使用するエンティティのオプションではなく、識別子が常に非 null になるため、バージョン属性はありません。そのシナリオの一般的なパターンは、新しいインスタンスを示すためにデフォルトの一時フラグを持つ共通の基本クラスを使用し、永続操作でそのフラグを反転するために JPA ライフサイクルコールバックを使用することです。

例 1: 手動で割り当てられた識別子を持つエンティティの基本クラス
@MappedSuperclass
public abstract class AbstractEntity<ID> implements Persistable<ID> {

  @Transient
  private boolean isNew = true; (1)

  @Override
  public boolean isNew() {
    return isNew; (2)
  }

  @PrePersist (3)
  @PostLoad
  void markNotNew() {
    this.isNew = false;
  }

  // More code…
}
1 新しい状態を保持するフラグを宣言します。一時的であるため、データベースに保持されません。
2Persistable.isNew() の実装でフラグを返し、Spring Data リポジトリが EntityManager.persist() を呼び出すか  … .merge() を呼び出すかを認識できるようにします。
3JPA エンティティコールバックを使用してメソッドを宣言し、save(…) へのリポジトリ呼び出しまたは永続性プロバイダーによるインスタンス作成の後にフラグが既存のエンティティを示すように切り替えられるようにします。