エンティティ Bean のライフサイクル

エンティティ Bean を開発するときには、Bean とコンテナの関係を活用して、Bean のコア ロジックのコンテキストの外部でロジックと最適化を実行します。コンテナがインスタンスを作成およびプールし、インスタンスにデータを割り当て、Bean メソッドを実行し、最終的にインスタンスを削除するとき、コンテナはコードを実行する機会を提供します。このトピックでは、エンティティ Bean のライフ サイクルの概要について説明し、その機会をいくつか示します。

下の図に、エンティティ Bean のライフサイクルを示します。エンティティ Bean には、次の 3 種類の状態があります。

各種の状態の期間中に利用可能なメソッドの他、さまざまな状態遷移について以下で説明します。

存在しない状態からプールされた状態へ移行する

WebLogic Server は、プール内に Bean インスタンスを作成するときに、コールバック メソッド public void setEntityContext(EntityContext ctx) を呼び出します。このメソッドには、パラメータ javax.ejb.EntityContext が指定されます。このパラメータはエンティティ コンテキストへの参照、すなわち EJB コンテナへのインタフェースを含みます。エンティティ コンテキストには、そのエンティティ Bean オブジェクトの自己参照や、メソッドの呼び出し側の識別などを行う複数のメソッドが含まれています。javax.ejb.EntityContext の詳細については、お好きな J2EE ドキュメントおよび http://java.sun.com にある API リファレンスを参照してください。

エンティティ Bean で EntityContext 参照を使用する場合は、このコールバック メソッドを実装し、参照を格納する必要があります。さらにこのメソッドは、Bean のメソッドのいずれかでその後に呼び出される他の Bean のホーム インタフェースをルックアップするのにもよく使用されます。次のコードは、この両方を示します。

@LocalRefs({
    @LocalRef(link="Recording") 
}) 
abstract public class BandBean extends GenericEntityBean implements EntityBean
{
    private EntityContext ctx;
    private RecordingHome recordingHome;

    public void setEntityContext(EntityContext c) {

    // EntityContext への参照を格納する
    ctx = c;

    // RecordingBean のホーム インタフェースをルックアップする
    try {
        javax.naming.Context ic = new InitialContext();
        recordingHome = (RecordingHome)ic.lookup("java:/comp/env/ejb/Recording"); 
    }
    catch(Exception e) {
        System.out.println("Unable to obtain RecordingHome: " + e.getMessage());
    }
}

プールされた状態

Bean インスタンスは、プールされた状態にある場合には、特定のビジネス オブジェクトに関連付けられていません。プールされた状態では、プールされた状態から準備完了状態への実質的な移行を行う、ホーム インタフェースで定義されたメソッド (ejbHome メソッドを除く) を呼び出すことができます。ホーム メソッドが呼び出されると、Bean インスタンスに固有でない結果が呼び出し側に返され、Bean インスタンスはプールされた状態のままになります。ホームメソッドは代わりに ejbSelect メソッドを頻繁に呼び出して Bean インスタンスをクエリします。

プールされた状態から準備完了状態へ移行する

以下のメソッドは、ビジネス オブジェクトを表すために Bean インスタンスをプールされた状態から準備完了状態へ移行します。

準備完了状態

Bean インスタンスは、準備完了状態にある場合には、ビジネス オブジェクトのデータを表します。この時点では、ビジネス メソッド (つまり、コンポーネント メソッドおよびアクセサ メソッド) をこのオブジェクトで呼び出すことができます (コンポーネント メソッドは代わりに ejbSelect メソッドを呼び出す場合もあります)。ビジネス メソッドが実行されると、Bean は準備完了状態に戻り、別のビジネス メソッド呼び出しを許可します。

EJB コンテナから見ると、コンポーネント メソッドの実行は、以下の 2 つの同期化手順の間に挟まれています。

  1. ビジネス メソッドが実行される前に、EJB コンテナは Bean インスタンスのフィールドをデータベース テーブルからの最新のデータで更新し、Bean インスタンスに確実に最新のデータがあるようにします。データが更新されるとすぐに、EJB コンテナはコールバック メソッド ejbLoad を呼び出します。エンティティ Bean がこの同期化手順の一部として何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。
  2. ビジネス メソッドが実行され、完了します。
  3. EJB コンテナは、データベース テーブルを更新し、確実にエンティティ Bean インスタンスからの最新のデータが格納されるようにします。つまり、ビジネス メソッドがデータ値を更新すると、この同期化手順によってそれらの変更が確実に格納されます。データベース テーブルが更新される直前に、EJB コンテナはコールバック メソッド ejbStore を呼び出します。エンティティ Bean がこの同期化手順の一部として何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。

データベース テーブル内のデータは複数の Bean インスタンスによる同時アクセスが可能なので、これらの同期化手順によって、各 Bean インスタンスに常に最新のデータがあることが保証されます。ただし、過剰な同期化手順によって不必要にパフォーマンスが低下する場合もあります。たとえば、エンティティ Bean が読み取り専用であり、めったに変更されないデータを読み込む場合があるとします。こうした場合、データの整合性違反の危険を冒すことなく、同期化手順を安全に回避できます。

準備完了状態からプールされた状態へ移行する

呼び出し側が remove メソッドを呼び出して、エンティティ Bean インスタンスとデータベース テーブルのその基底のレコードを削除する場合、EJB コンテナによって Bean インスタンスが削除されます。インスタンス削除の直前、EJB コンテナはコールバック メソッド ejbRemove を呼び出します。エンティティ Bean が、削除の前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。データが削除されると、Bean インスタンスはプールされた状態に戻ります。Bean インスタンスは、特定のビジネス オブジェクトに関連付けられなくなり、ホーム メソッド、またはそのインスタンスを一連の新しいデータに関連付けて準備完了状態に移行するメソッドのいずれかを実行するのに使用されます。

エンティティ Bean インスタンスを削除する方法の詳細については、「エンティティ Bean インスタンスの削除」を参照してください。

アクティブ化とパッシベーション

より最適にリソースを管理するため、EJB コンテナは Bean インスタンスを準備完了状態からプールされた状態に移行させることによる、パッシベーションを行うことがあります。パッシベーション時には、エンティティ Bean インスタンスは、それが表すビジネス オブジェクトとの関連付けが解除され、別の一連のデータを表すために使用できるようになります。逆に、パッシベーションされた Bean がアクティブ化される、つまり、ビジネス オブジェクトを表すためにプールされた状態から準備完了状態へ移行する場合もあります。

エンティティ Bean インスタンスの呼び出し側 (クライアント アプリケーションまたは別の EJB) には、パッシベーションが行われたことは伝わりません。エンティティ Bean インスタンスへの呼び出し側の参照は、引き続き保持されており有効です。つまり、呼び出し側がその後エンティティ Bean インスタンスでビジネス メソッドを呼び出すと、プールされた状態のインスタンスはこのビジネス オブジェクトを表すために準備完了状態に移行されます。

Bean インスタンスは、そのビジネス メソッドがまったく呼び出されないときにパッシベーションされます。パッシベーションは同期が完了した後に発生し、ビジネス オブジェクトに対するすべての変更がデータベースに格納されていることを保証します。実際のパッシベーションの直前に、コールバック メソッド ejbPassivate が呼び出されます。エンティティ Bean が、パッシベーションの前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。

以前にパッシベーションが行われた Bean インスタンスがビジネス メソッド呼び出しを行うためにアクティブ化される場合は、コールバック メソッド ejbActivate が呼び出されます。エンティティ Bean が、アクティブ化の前に何らかのカスタム ロジックの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。たとえば、このコールバック メソッドを使用して非永続のフィールド (データベースに格納されていないフィールド) の値を再初期化する場合があるとします。コールバック メソッドが実行され完了すると、先述の節で説明した「同期 - ビジネス メソッド呼び出し - 同期」という手順が、他のビジネス メソッド呼び出し時と同じように続きます。つまり、最初の同期が発生し、最新の Bean インスタンスがデータベースの最新のデータで更新され、続いて ejbLoad コールバック メソッドが呼び出されます。ビジネス メソッドの呼び出しが完了した後、ビジネス メソッドが完了すると、2 番目の同期が発生します。そのとき、ejbStore コールバック メソッドが呼び出され、最新の Bean インスタンスのデータがデータベースに格納されます。

プールされた状態から存在しない状態へ移行する

より最適にリソースを管理するために、または WebLogic Server の停止時に、EJB コンテナは、ガベージ コレクションを可能にして Bean インスタンスをプールされた状態から存在しない状態へ削除することがあります。破棄の直前に、コールバック メソッド unsetEntityContext が呼び出されます。エンティティ Bean が、ガベージ コレクションの前に何らかのクリーンアップ アクションの実行を必要とする場合は、このコールバック メソッドを使用して実装できます。

関連トピック

エンティティ Bean の関係


さらにヘルプが必要ですか。質問は Workshop ニュース グループまでお寄せください。