JPA内部コールバックメソッド 内部コールバックメソッドは、エンティティクラス内で定義されたメソッドです。たとえば、以下のエンティティ・クラスが空の実装とサポートされているすべてのコールバックメソッドを定義しています
@Entity
public static class MyEntityWithCallbacks {
@PrePersist void onPrePersist() {}
@PostPersist void onPostPersist() {}
@PostLoad void onPostLoad() {}
@PreUpdate void onPreUpdate() {}
@PostUpdate void onPostUpdate() {}
@PreRemove void onPreRemove() {}
@PostRemove void onPostRemove() {}
}
内部のコールバックメソッドは、常にvoidを返しと引数を取るべきではありません。名前とアクセスレベル(公開、保護、パッケージ、プライベート)は任意ですが、静的であってはいけません。
注釈コールバックメソッドが呼び出されたときに指定:
@PrePersist - before a new entity is persisted (added to the EntityManager).
@PostPersist - after storing a new entity in the database (during commit or flush).
@PostLoad - after an entity has been retrieved from the database.
@PreUpdate - when an entity is identified as modified by the EntityManager.
@PostUpdate - after updating an entity in the database (during commit or flush).
@PreRemove - when an entity is marked for removal in the EntityManager.
@PostRemove - after deleting an entity from the database (during commit or flush).
エンティティ・クラスは、任意のサブセットまたはライフサイクルイベントの組み合わせが、同じイベントのない複数のコールバックメソッドのコールバックメソッドを含むことができます。ただし、複数のコールバックイベントに対して、同じメソッドを複数の注釈でマークすることで使用できます。
デフォルトでは、スーパークラスのコールバックメソッドはサブクラスのエンティティオブジェクトに対して呼び出され、そのコールバックメソッドはサブクラスによってオーバーライドされます。
実装の制限 エンティティライフサイクルイベント(まだ進行中)を起動する元のデータベース操作との競合を回避するため、コールバックメソッドはEntityManagerまたはQueryメソッドを呼び出すべきではなく、他のエンティティオブジェクトにアクセスしないでください。
アクティブなトランザクション内でコールバックメソッドが例外をスローすると、トランザクションはロールバック用としてマークされ、その操作のためのコールバックメソッドはそれ以上呼び出されません。
ねえ。私がテストすると、リスナー内のすべての操作がマスター操作の同じトランザクション内にあることがわかります。 @PostUpdateアノテーションを使用してリスナーをマークします。 – Scarlett