8.15.3 コールバックメソッドの呼び出し順序
エンティティに対して複数のコールバックメソッドを定義した場合,呼び出し順序は次の規則に従います。
-
O/Rマッピングファイルに定義した順番でデフォルトリスナが呼び出されます。
明示的に@ExcludeDefaultListenersまたはO/Rマッピングファイルの<exclude-default-listeners>タグを指定しないかぎり,デフォルトリスナは永続化ユニット内のすべてのエンティティに適用されます。
-
@EntityListenersで指定された順番にコールバックメソッドが呼び出されます。
なお,O/Rマッピングファイルを使用すると,次の操作ができます。
-
エンティティに対するコールバックメソッドの呼び出し順序を指定する。
-
アノテーションでの指定順序をオーバーライドする。
-
-
エンティティ(またはマップドスーパークラス)に指定されたコールバックメソッドが呼び出されます。
- 〈この項の構成〉
(1) 継承階層内での呼び出し順序
エンティティクラスやマップドスーパークラスの継承階層の中で複数回のエンティティリスナを定義した場合,呼び出し順序は次のようになります。
-
デフォルトコールバックリスナがあれば,最初に呼び出されます。
-
エンティティリスナクラスのコールバックメソッドがスーパークラスに指定されているリスナから順番に呼び出されます。このとき,@EntityListenerなどの指定があれば,その順序に従います。
-
すべてのエンティティリスナのコールバックメソッドが呼び出されたあとで,エンティティ(またはマップドスーパークラス)に定義されたコールバックメソッドがスーパークラスに指定されているリスナから順番に呼び出されます。
コールバックメソッドをサブクラスでオーバーライドした場合には,オーバーライドされたメソッドは呼び出されません。オーバーライドしたコールバックメソッドが異なるライフサイクルのイベントを指定している場合,またはライフサイクルコールバックメソッドではない場合,オーバーライドされた側のメソッドは呼び出されます。また,メソッドのコールバックメソッドの設定はオーバーライドされます。
(2) コールバックメソッドの除外について
-
@ExcludeDefaultListenersまたはO/Rマッピングファイルの<exclude-default-listeners>タグを指定すると,デフォルトエンティティリスナはエンティティクラス(またはmapped superclass)とそのサブクラスでは呼び出されません。
-
@ExcludeSuperclassListenersまたはO/Rマッピングファイルの<exclude-superclass-listeners>タグがエンティティクラスやmapped superclassに適用されると,そのクラスとそのサブクラスではリスナのコールバックメソッドは呼び出されません。@ExcludeSuperclassListenersまたはO/Rマッピングファイルの<exclude-superclass-listeners>タグは,デフォルトのエンティティリスナの呼び出しを除外することにはなりません。
-
O/Rマッピングファイルを使用して,entityやmapped superclassへの除外されたデフォルト/スーパークラスリスナを明示的に指定すると,エンティティやそのサブクラスに適用されることになります。