8.15.1 コールバックメソッドの指定個所
コールバックメソッドは,次の場所に指定できます。
-
エンティティクラスまたはマップドスーパークラス内
-
エンティティクラスまたはマップドスーパークラスに関連づけられたエンティティリスナクラス
エンティティリスナクラスとは,コールバックメソッドを実装するための専用のクラスです。エンティティリスナクラスを使用すると,コールバックメソッドの実装部分を分離できます。
コールバックメソッドは,アノテーションまたはO/Rマッピングファイルで指定します。ただし,デフォルトのコールバックメソッドは,O/Rマッピングファイルで指定します。アノテーションでは指定できません。なお,デフォルトのコールバックメソッドとは,永続化ユニット内のすべてのエンティティに適用されるエンティティリスナを指します。
コールバックリスナの指定方法について説明します。
(1) アノテーションでのコールバックメソッドの指定
コールバックメソッドの指定にアノテーションを使用する場合は,次の表にあるアノテーションをメソッドに設定してください。ライフサイクルイベントに応じてメソッドを呼び出すことができます。
アノテーション |
実行される内容 |
---|---|
@PostLoad |
エンティティが永続化コンテキストにロードされたあとか,またはrefresh操作が適用されたあとに,コールバックメソッドが実行されます。キャッシュからエンティティを読み込んだあと,またはデータベースにSELECT文を発行したタイミングで実行されます。 |
@PrePersist @PreRemove |
EntityManagerがエンティティのpersistまたはremove操作を行う前にコールバックメソッドが呼び出されます。マージ操作が適用され,新しくmanaged状態のインスタンスが作成される場合,managed状態のインスタンスへのPrePersistコールバックメソッドは,エンティティの状態がコピーされたあとに呼び出されます。これらのPrePersistまたはPreRemoveのコールバックは操作がカスケードされるすべてのインスタンスに対しても呼び出されます。PrePersistまたはPreRemoveメソッドは常にpersist,merge,またはremove操作の一部として同期を取って呼び出されます。 |
@PostPersist @PostRemove |
PostPersistおよびPostRemoveコールバックメソッドは,エンティティがpersistまたはremove操作で,永続化されたあとまたは削除されたあとで呼び出されます。 これらのコールバックは操作がカスケードされたすべてのエンティティに対しても呼び出されます。PostPersistまたはPostRemoveメソッドは,それぞれデータベースのinsertまたはdelete操作が行われたあとに呼び出されます。これらのデータベースへの操作はpersist,merge,もしくはremove操作の直後,またはflushメソッドが呼び出されたあとになります。ただし,トランザクションの終了時になることもあります。生成されたプライマリキーはPostPersistメソッドで利用できます。 |
@PreUpdate @PostUpdate |
PreUpdateおよびPostUpdateのコールバックはそれぞれエンティティデータのデータベースへのupdate操作の前後に呼び出されます。 これらのデータベースへの操作はエンティティの状態が更新された場合,または状態がデータベースにフラッシュされた場合に実行されます。ただし,データベースへの操作は,トランザクションの終了時になることもあります。一つのトランザクション内で,エンティティを永続化してから更新したり,エンティティを更新してから削除したりした場合には,PreUpdateやPostUpdateのコールバックが発生しないことがあります。 |
エンティティリスナクラスを利用する場合,エンティティに対して@EntityListenerを指定してエンティティリスナクラスを指定する必要があります。指定方法の例を次に示します。
@Entity @EntityListeners(CallbackListener.class) public class Employee implements Serializable{ ・・・ }
(2) O/Rマッピングファイルでのコールバックリスナの指定
O/Rマッピングファイルを使用してコールバックメソッドを指定する場合は次のように指定します。
-
エンティティリスナのクラスおよびそのクラスのコールバックメソッドを指定する場合,O/Rマッピングファイルの<entity-listener>タグを使用します。ライフサイクルリスナメソッドは,<entity-listener>タグ下の,<pre-persist>タグ,<post-persist,>タグ,<pre-remove>タグ,<post-remove>タグ,<pre-update>タグ,<post-update>タグ,および<post-load>タグを使用して指定します。
-
エンティティリスナクラスのコールバックメソッドを指定する場合は,コールバックイベントごとに最大一つのメソッドを<entity-listener>タグ以下のタグを使用して指定できます。
-
<persistence-unit-defaults>タグの<entity-listeners>タグの下位タグに対して,O/Rマッピングファイルの<entity-listener>タグを指定するとデフォルトコールバックメソッドが指定できます。
-
<entity>タグまたは<mapped-subclass>タグにある<entity-listeners>タグの下位タグに,<entity-listener>タグを指定すると,エンティティまたはマップドスーパークラスとそのサブクラスに対するコールバックリスナの指定になります。
-
<entity-listeners>タグに指定したリスナの順番でコールバックリスナは呼び出されます。リスナの呼び出し順序については,「8.15.3 コールバックメソッドの呼び出し順序」を参照してください。