Cosminexus V9 アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)

[目次][用語][索引][前へ][次へ]

6.15.1 コールバックメソッドの指定個所

コールバックメソッドは,次の場所に指定できます。

エンティティリスナクラスとは,コールバックメソッドを実装するための専用のクラスです。エンティティリスナクラスを使用すると,コールバックメソッドの実装部分を分離できます。

コールバックメソッドは,アノテーションまたはO/Rマッピングファイルで指定します。ただし,デフォルトのコールバックメソッドは,O/Rマッピングファイルで指定します。アノテーションでは指定できません。なお,デフォルトのコールバックメソッドとは,永続化ユニット内のすべてのエンティティに適用されるエンティティリスナを指します。

コールバックリスナの指定方法について説明します。

<この項の構成>
(1) アノテーションでのコールバックメソッドの指定
(2) O/Rマッピングファイルでのコールバックリスナの指定

(1) アノテーションでのコールバックメソッドの指定

コールバックメソッドの指定にアノテーションを使用する場合は,次の表にあるアノテーションをメソッドに設定してください。ライフサイクルイベントに応じてメソッドを呼び出すことができます。

表6-18 アノテーションを使用したコールバックメソッドの指定

アノテーション 実行される内容
@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マッピングファイルを使用してコールバックメソッドを指定する場合は次のように指定します。