8.15.2 コールバックメソッドの実装
ユーザは必要に応じてコールバックメソッドを実装します。エンティティクラスやマップドスーパークラス内に実装するコールバックメソッドとエンティティリスナクラスのコールバックメソッドでコールバックメソッドのシグネチャは異なります。
エンティティクラスやマップドスーパークラスで定義されるコールバックメソッドは次に示すシグネチャになります。
void <METHOD>
また,エンティティリスナクラスで定義されるコールバックメソッドは次に示すシグネチャになります。
void <METHOD>(Object)
引数のObjectには,コールバックメソッドが実行されるエンティティのインスタンスを指定します。
(1) コールバックメソッド使用時の注意事項
コールバックメソッドについては,次に示す注意事項があります。これらの条件を満たさない場合,アプリケーションの開始時に例外が発生して,アプリケーションの開始に失敗します。
-
publicで引数がないコンストラクタを持たなければなりません。
-
コールバックメソッドではpublic,private,protected,およびパッケージレベルのアクセスができます。ただし,staticやfinalは使用できません。
-
一つのクラスが同じライフサイクルイベントに対して複数のライフサイクルコールバックメソッドを持つことはできません。ただし,同じメソッドが複数のコールバックイベントで使用されることがあります。
(2) コールバックメソッドに適用されるルール
コールバックメソッドについては次に示すルールが適用されます。
-
コールバックメソッドでは,未チェックまたは実行時例外の送出が許可されています。トランザクション中に実行したコールバックメソッドでスローされた実行時例外は,トランザクションをロールバックさせます。コールバックメソッドが複数指定されている場合,実行時例外がスローされたあとには残りのコールバックメソッドは実行されません。
-
コールバックメソッドでは,JNDI,JDBC,JMS,Enterprise Beanを実行できます。
-
コールバックメソッドで次の操作をしないでください。
-
EntityManagerを呼び出す。
-
クエリ操作を実行する。
-
ほかのエンティティインスタンスにアクセスする。
-
リレーションシップを更新する。
このような方法で使用した場合,動作を保証しません。
-
-
Java EE環境でコールバックメソッドが呼び出された場合,エンティティのコールバックリスナは呼び出すコンポーネントのネーミングコンテキストを共有します。また,エンティティのコールバックメソッドは,コールバックメソッドが呼び出された時点の呼び出し元コンポーネントのトランザクションとセキュリティコンテキストで呼び出されます。