EJB 3.0(Public Draft)入門記 Java Persistence API Chapter3 その9
エンティティリスナとコールバックメソッドについてです。
3.4 Entity Listeners and Callback Methods
エンティティのライフサイクルのイベントに関する通知をうけとるコールバックメソッドを使うことができます。これはエンティティにアノテーションで指定できます。コールバックメソッドの代わりにエンティティリスナクラスを使うことも可能だそうです。エンティティリスナクラスを使う場合はEntityListenerアノテーションをエンティティに指定することになります。Simplified APIのコールバックメソッドやコールバックリスナークラスと似てますね。Simplified APIのコールバックメソッドやコールバックリスナークラスについてはここに書きました。
コールバックのルールです。
- コールバックメソッドは実行時例外をスローすることができる。トランザクション内でスローされた場合、トランザクションはロールバックされる
- コールバックメソッドはアプリケーション例外をスローしてはいけない
- コールバックメソッドはJNDI、JDBC、JMS、エンタープライズBeanを呼び出すことができるが、EntityManagerを呼び出すことはできない
1番目と2番目はいいとして、3番目はちょっと不思議な気がしないでもないです。JDBCはいいけどEntityManagerは駄目なんだ。コールバックが無限に連鎖する可能性があるから?あとセッションBeanを呼んでそのセッションBeanがEntityManager使っているというのはどうなんだろう、たぶん駄目?かな。
コールバックメソッドのシグニチャは次のようになります。
- エンティティに定義する場合
- public void
()
- public void
- エンティティリスナーに定義する場合。Objectは実行時にリスナに引数で渡される実際のエンティティの型を意味します。
- public void
(Object)
- public void
サポートされているコールバックは7つです。
- PrePersist
- EntityManagerのpersit操作が実行、もしくはカスケードされる前に呼ばれる。呼び出しはpersist操作と同時に起こる。
- PostPersist
- EntityManagerのpersit操作が実行、もしくはカスケードされた後に呼ばれる。データベースのINSERT後に呼ばれる。
- PreRemove
- EntityManagerのremove操作が実行、もしくはカスケードされる前に呼ばれる。呼び出しはremove操作と同時に起こる。
- PostRemove
- EntityManagerのremove操作が実行、もしくはカスケードされた後に呼ばれる。データベースのDELETE後に呼ばれる。
- PreUpdate
- データベースのUPDATEが実行される前に呼ばれる
- PostUpdate
- データベースのUPDATEが実行された後に呼ばれる
- PostLoad
- エンティティが現在の永続コンテキストにロードされるかエンティティがリフレッシュされた後に呼ばれる
PreUpdateとPostUpdateが特に対応するEntityManagerへの操作がないという点でちょっと特別な感じでしょうか。
PostPersistとPostRemoveの説明がHibernate EntityManagerのドキュメントChapter 5. Entity listeners and Callback methodsと微妙に異なるのが気になります。ちなみにですが、Hibernate EntityManagerのドキュメントは結構参考になっていいです。HibernateにあるけどPersistent APIにはない機能とかの説明もあったりします。
今日はサンプルコードはやめ(眠いので...)。コールバックはいずれ試してみたいと思います。
そういえば話は変わって、前々回
em.createQuery("from Employee").getSingleResult();
といったコードを書きましたが、この「from Employee」というHQL的な書き方はEJB-QLでは駄目らしいです。select節は省略できないとか。動いてたんですけどね。