JBoss EJB 3.0と拡張機能

  エンティティBeanのライフサイクル
はじめに

ここまで、EntityManagerを使ったエンティティBeanの操作方法について学んできました。エンティティBeanでアノテーションによって指定されるライフサイクルコールバックメソッドを使うと、Beanの振る舞いをより自動化し、アプリケーションコードの量をさらに減らすことが可能になります。例えば、投資計算機アプリケーションでは、コンテナは自動的にコールバックメソッドを呼び出し、TimedRecord Beanのタイムスタンプを更新し、その後、そのBeanはデータベースに保存されます。これはアプリケーションでの関連するセッターメソッド呼び出しを取り除きます。

このトレイルでは、エンティティBeanのライフサイクルコールバックメソッドの動作を学びます。それらは初期のトレイルで議論したセッションBeanのコールバックメソッドと大変良く似ています。

ライフサイクルメソッドのアノテーション

エンティティBeanクラスの任意のメソッドに次のアノテーションを指定することができます。コンテナは、そのBeanのライフサイクルの適切な段階で自動的にアノテーション付きのメソッドを呼び出します。

  • @PrePersist: データベースでエンティティが作成される直前にこのアノテーションが付いたメソッドが呼び出される。
  • @PostPersist: データベースでエンティティが作成された直後にこのアノテーションが付いたメソッドが呼び出される。
  • @PreRemove: データベースでエンティティが削除される直前にこのアノテーションが付いたメソッドが呼び出される。
  • @PostRemove: データベースでエンティティが削除された直後にこのアノテーションが付いたメソッドが呼び出される。
  • @PreUpdate: データベースが更新される直前にこのアノテーションが付いたメソッドが呼び出される。
  • @PostUpdate: データベースが更新された直後にこのアノテーションが付いたメソッドが呼び出される。
  • @PostLoad: データベースからデータがロードされて、エンティティに関連付けれた直後にこのアノテーションが付いたメソッドが呼び出される。

エンティティBeanのためのもう一つのライフサイクルメソッド用アノテーションは@Removeタグです。それはコールバックメソッドではありません。なぜなら、(コンテナでなく)アプリケーションがEntityManager管理コンテキストから指定されたBeanインスタンスを削除するために@Removeメソッドを呼び出すからです。Beanインスタンスは分離状態(detached)になり、それを再び使用することはできません。このBeanインスタンスに対する変更は、コミットしていなければ失われることになります。

それらのアノテーション付きライフサイクルメソッド内での修正は、この操作がカスケードされたすべてのエンティティBeanにカスケードします。

コールバックメソッドを別クラスに分ける

セッションBeanと同様に、アノテーション付きライフサイクルコールバックメソッドも別のクラスに配置することが可能で、@EntityListenerアノテーションを使ってそのクラスを指定されたBeanのための「コールバックリスナー」クラスとして指定することができます。


@Entity
@EntityListener(TimedRecordEntityListener.class)
public class TimedRecord extends Record {
    // ... ...
}

TimedRecordEntityListener 内のコールバックメソッドはTimedRecordオブジェクトを引数として取ります。コンテナは、実行時にこのコールバックイベントの原因となるTimedRecordオブジェクトを渡します。


public class TimedRecordEntityListener {

    @PrePersist
    public prepareTimestamp (TimedRecord rec) {
        // ... ...
    }
    
    @PreUpdate
    public updateTimestamp (TimedRecord rec) {
        // ... ...
    }

}
まとめ

このトレイルでは、エンティティBeanのライフサイクルコールバックメソッドについて議論しました。練習として、投資計算アプリケーションをリファクタリングして記録のタイムスタンプを自動的に更新するようにコールバックメソッドを使うことも可能です。

次のトレイルでは、デフォルトの組み込みHSQLDB以外のデータベースのためのエンティティBeanの構成方法と複数の永続コンテキスト(persistence context)の概念について議論します。