永続化エンティティ
このセクションでは、Spring Data JPA でエンティティを永続化(保存)する方法について説明します。
エンティティの保存
エンティティの保存は、CrudRepository.save(…)
メソッドを使用して実行できます。基礎となる JPA EntityManager
を使用して、指定されたエンティティを永続化またはマージします。エンティティがまだ永続化されていない場合、Spring Data JPA は entityManager.persist(…)
メソッドの呼び出しでエンティティを保存します。それ以外の場合は、entityManager.merge(…)
メソッドを呼び出します。
エンティティ状態検出戦略
Spring Data JPA は、エンティティが新しいかどうかを検出するために次の戦略を提供します。
バージョンプロパティと ID プロパティインスペクション ( デフォルト ): デフォルトでは、Spring Data JPA は最初に非プリミティブ型のバージョンプロパティがあるかどうかをインスペクションします。ある場合、そのプロパティの値が
null
であれば、エンティティは新規であるとみなされます。このようなバージョンプロパティがない場合、Spring Data JPA は指定されたエンティティの識別子プロパティをインスペクションします。識別子プロパティがnull
の場合、エンティティは新規であるとみなされます。それ以外の場合は、新規ではないとみなされます。他の Spring Data モジュールとは対照的に、JPA は0
(ゼロ) をエンティティの最初の挿入バージョンとみなすため、プリミティブバージョンプロパティを使用してエンティティが新規かどうかを判断することはできません。Persistable
の実装: エンティティがPersistable
を実装している場合、Spring Data JPA は新しい検出をエンティティのisNew(…)
メソッドに委譲します。詳細については、JavaDoc (Javadoc) を参照してください。EntityInformation
の実装:JpaRepositoryFactory
のサブクラスを作成し、それに応じてgetEntityInformation(…)
メソッドをオーバーライドすることにより、SimpleJpaRepository
実装で使用されるEntityInformation
抽象化をカスタマイズできます。次に、JpaRepositoryFactory
のカスタム実装を Spring Bean として登録する必要があります。これはほとんど必要ないことに注意してください。詳細については、JavaDoc (Javadoc) を参照してください。
オプション 1 は、手動で割り当てられた識別子を使用するエンティティのオプションではなく、識別子が常に非 null
になるため、バージョン属性はありません。そのシナリオの一般的なパターンは、新しいインスタンスを示すためにデフォルトの一時フラグを持つ共通の基本クラスを使用し、永続操作でそのフラグを反転するために JPA ライフサイクルコールバックを使用することです。
@MappedSuperclass
public abstract class AbstractEntity<ID> implements Persistable<ID> {
@Transient
private boolean isNew = true; (1)
@Override
public boolean isNew() {
return isNew; (2)
}
@PostPersist (3)
@PostLoad
void markNotNew() {
this.isNew = false;
}
// More code…
}
1 | 新しい状態を保持するフラグを宣言します。一時的であるため、データベースに保持されません。 |
2 | Persistable.isNew() の実装でフラグを返し、Spring Data リポジトリが EntityManager.persist() を呼び出すか … .merge() を呼び出すかを認識できるようにします。 |
3 | JPA エンティティコールバックを使用してメソッドを宣言し、save(…) へのリポジトリ呼び出しまたは永続性プロバイダーによるインスタンス作成の後にフラグが既存のエンティティを示すように切り替えられるようにします。 |