エンティティ Bean 入門

このトピックでは、CMP エンティティ Bean の開発の概要について説明します。内容は以下のとおりです。


CMP エンティティ Bean とは

エンティティ Bean は、永続ストレージ メカニズム内のビジネス オブジェクトを表します。つまり、エンティティ Bean を使用することで、長期にわたって格納および記録する必要のある現実世界のオブジェクトを、プロパティを使ってモデリングできます。ビジネス オブジェクトの例としては、顧客、製品、注文、クレジット カード、住所などがあります。通常、各エンティティ Bean はリレーショナル データベースに基底のテーブルを持ち、Bean の各インスタンスはそのテーブルの行に対応します。エンティティ Bean には、オブジェクト (つまり、データベース内の特定のレコード) をユニークに識別するための 1 つまたは複数の主キー (ユニークなインデックス) があります。

コンテナ管理による永続性 (CMP) エンティティ Bean とは、プロパティ フィールドおよび関係フィールドの基底のデータベースへのマッピングが EJB コンテナによって処理され、エンティティ Bean に対するデータの挿入、更新、および削除方法が EJB コンテナによって決定されるエンティティ Bean のことです。

Workshop でエンティティ Bean を開発する

Workshop では、weblogic.ejb.GenericEntityDrivenBean を拡張し、javax.ejb.EntityBean を実装し、クラスを作成することによってエンティティ Bean を開発します。このクラスには、EJB の特性を指定する @Entity、@JndiName、および @FileGeneration アノテーション (さらに必要に応じて他のアノテーション) を追加します。また、仮想フィールド、select および find メソッド、および他のエンティティとの関係を指定するアノテーションも追加します。

[WebLogic エンティティ Bean] テンプレートを使用することによって、IDE で簡単に開発を開始できます。テンプレートを使用する場合、IDE では次のようなコードが生成されます。

/**
 * Workshop によって自動生成される GenericEntityBean サブクラス。 * 
 * 各自の用途に合わせて、既存の内容を確認および更新する
 * こと (特に Entity および JndiName アノテーション、主キー フィールド、 * ejbCreate() および ejbPostCreate() メソッド)。
 */
@Entity(ejbName = "MyEntityBean", 
        dataSourceName = "samplesDataSource", 
        tableName = "MyEntityBean", 
        primKeyClass = "java.lang.Integer")
@JndiName(local = "ejb.MyEntityBeanLocalHome")
@FileGeneration(localClass = Constants.Bool.TRUE, 
        localHome = Constants.Bool.TRUE, 
        remoteClass = Constants.Bool.FALSE, 
        remoteHome = Constants.Bool.FALSE, 
        valueClass = Constants.Bool.TRUE)
abstract public class MyEntityBean 
    extends GenericEntityBean 
    implements EntityBean {

    /**
     * 重要 : 自動生成される ejbCreate() メソッド。
     * 必要に応じて変更すること。     */
    public java.lang.Integer ejbCreate(java.lang.Integer key)
            throws CreateException {
        setKey(key);
        return null;
    }

    /**
     * 重要 : 自動生成される ejbPostCreate() メソッド。
     * 必要に応じて変更すること。     */
    public void ejbPostCreate(java.lang.Integer key) {
    }

    /**
     * 重要 : 自動生成される主キー フィールド ゲッター メソッド。
     * 必要に応じて名前とクラスを変更すること。     */
    @CmpField(column = "key", primkeyField = Constants.Bool.TRUE)
    @LocalMethod()
    public abstract java.lang.Integer getKey();

    /**
     * 重要 : 自動生成される主キー フィールド セッター メソッド。
     * 必要に応じて名前とクラスを変更すること。     */
    @LocalMethod()
    public abstract void setKey(java.lang.Integer key);
}

注意 : [WebLogic エンティティ Bean] テンプレートを使用するには、[プロジェクト・エクスプローラー] でその Bean が存在するパッケージを右クリックし、[新規|その他] を選択して [EJB] を展開してから [WebLogic エンティティ Bean] をクリックします。

コードには、一般的に使用されるクラスレベルのアノテーション属性の値が含まれています。また、テンプレートによって生成されたコードには、主キー用のコンテナ管理による永続性 (CMP) フィールドが含まれています。このコードを出発点として使用して、作成メソッド、仮想フィールド宣言、ビジネス ロジック用のメソッドなどのコードを環境に合わせて書き換えます。

Workshop は、これらのアノテーションを使用して、EJB エンティティ Bean で必要なインタフェースと記述子フアイルを生成します。以下の節では、これらのエンティティ Bean の構成要素と特性について説明します。

ホーム インタフェースとビジネス インタフェース

エンティティ Bean には、ローカル ホーム インタフェース、ローカル ビジネス インタフェース (または単にローカル インタフェース)、リモート ホーム インタフェース、およびリモート ビジネス インタフェース (または単にリモート インタフェース) と呼ばれる 4 種類のインタフェースを指定できます。ローカル インタフェースは、同一のアプリケーション内で定義される他の EJB、EJB コントロール、Web サービス、およびページ フローによって使用可能な Bean のメソッドを定義します。つまり、エンティティ Bean を定義し、それを当該アプリケーション内だけで使用する予定の場合は、ローカル インタフェースを使用できます。対照的に、リモート インタフェースは、他のアプリケーションで定義される EJB、EJB コントロール、Web サービス、およびページ フローによって呼び出される Bean のメソッドを定義します。

Workshop では、[プロパティ] ビューを使用して特定のエンティティ Bean のインタフェース名を設定または表示できます。そのためには、エンティティ Bean のソース コードを開き、カーソルをクラス コード (メソッド、他のメンバー、またはアノテーションではない) に合わせます。[プロパティ] ビューで、FileGeneration アノテーションの属性値がリストされている場所までスクロールします。ここには、localHomeName と localClassName (ビジネス インタフェース)、remoteHomeName と remoteClassName (リモート インタフェース) などの属性が表示されます。これらは、ソース コード中の @FileGeneration アノテーションの属性に対応しています。

クライアント アプリケーションおよび他のセッション Bean またはエンティティ Bean は、(リモートまたはローカル) ホーム インタフェースのメソッドを使用することで通信するエンティティ Bean のインスタンスを取得できます。ホーム インタフェースのメソッドには、create メソッド、findByPrimaryKey メソッド、単一のエンティティ Bean インスタンスへの参照または複数のエンティティ Bean インスタンスへの一連の参照を返すその他のファインダ メソッドなどがあります。さらに、ホーム メソッドがローカル インタフェースで定義されます。(リモートまたはローカル) ビジネス インタフェースには、エンティティ Bean インスタンスを操作するメソッドが含まれます。これらのメソッドには、フィールドのアクセサ (ゲッターおよびセッター) メソッド、コンポーネント メソッドなどがあります。

CMP フィールド

コンテナ管理による永続性 (CMP) フィールドには、ビジネス オブジェクトのプロパティが格納されます。たとえば、Customer Bean には、名前、最終価格、性別、年齢などのフィールドが含まれる場合があります。これらのプロパティのデータベースへのマッピングは EJB コンテナによって処理されるので、CMP フィールドはエンティティ Bean 内の仮想フィールドです。つまり、これらのフィールドはエンティティ Bean 自体では定義されませんが、データベース テーブル内のカラムに対応しています。エンティティ Bean は、アクセサ (ゲッターおよびセッター) メソッドを定義するだけです。CMP フィールドは、主キー フィールドとして機能できます。このフィールドによって、エンティティ Bean インスタンスをユニークに識別できます。複数の主キーが定義されている場合には、他の主キーと組み合わせてエンティティ Bean インスタンスをユニークに識別できます。

エンティティ Bean では、CMP フィールドは @CmpField アノテーションで指定します。

作成メソッド

ejbCreate メソッドを使用して、エンティティ Bean の新しいインスタンスを作成 (つまり、基底のデータベースに新しいレコードを挿入) できます。少なくとも 1 つの ejbCreate メソッドを定義する必要がありますが、複数の ejbCreate メソッドを定義することはまれです。エンティティ Bean に対して定義される各 ejbCreate メソッドには、シグネチャ public PrimaryKeyClass ejbCreate(parameters) があります。PrimaryKeyClass は、単一の主キーが定義されている場合には Integer などのプリミティブ型になることもありますが、@FileGeneration アノテーションの属性で指定された名前を持つ別の主キー クラスになることもあります。エンティティ Bean に対して使用されている主キー クラスを確認するには、デザイン ビューを表示してからプロパティ エディタの [General] セクションに移動します。ソース ビューでは、この属性は @Entity アノテーションの一部です。

複数の ejbCreate メソッドは、パラメータの構成によってのみ識別できます。ホーム インタフェースでは、ejbCreate メソッドは create メソッドとしてエクスポーズされており、各メソッドで必要になる一連のユニークなパラメータによってのみ識別できます。

コンポーネント メソッド

コンポーネント メソッドは、エンティティ Bean インスタンスで呼び出されるビジネス メソッドです。ビジネス メソッドの例としては、updateCustomer(firstName, lastName, age) などがあります。このメソッドは Bean の setFirstName メソッド、setLastName メソッド、および setAge メソッドを順に呼び出して、該当する情報を保持している CMP フィールドを更新します。

ホーム メソッド

ホーム メソッドは、エンティティ Bean に関係しているが、単一の Bean インスタンスに固有でないビジネス メソッドです。たとえば、Customer Bean には、25 歳から 35 歳までの顧客の総数を返すホーム メソッドが含まれる場合があります。ホーム メソッドは、Bean 内で ejbHomeMethodName メソッドとして定義され、Bean のホーム インタフェースで MethodName メソッドとしてエクスポーズされます。たとえば、Bean クラスで定義されるメソッド ejbHomeGetNCustomers は、そのホーム インタフェースで getNCustomers としてエクスポーズされます。

ファインダ メソッドと選択メソッド

ファインダ メソッドと選択メソッドは、EJB QL または WebLogic QL クエリ言語を使用してデータベースに対してクエリを実行するメソッドです。ファインダ メソッドは、Bean のホーム インタフェースで定義され、単一の Bean インスタンスへの参照または複数の Bean インスタンスへの一連の参照を返します。対照的に、選択メソッドはどのインタフェースでも定義されず、Bean のコンポーネント メソッドなどによって内部的に呼び出されるだけです。選択メソッドは、単一の Bean インスタンスへの参照、複数の Bean インスタンスへの一連の参照、または 1 つあるいは複数の個々の CMP フィールドへの参照を返すことができます。

Bean に対して定義されるファインダ メソッドと選択メソッドに加えて、Bean クラスに対して定義されるホーム インタフェース内にメソッド findByPrimaryKey(PrimaryKeyClass) が WebLogic によって自動的に定義されます。このメソッドは、メソッドのパラメータによってユニークに定義される Bean インスタンスへの参照を返します。先ほどと同様に、PrimaryKeyClass は、単一の主キーが定義されている場合には Integer などのプリミティブ型になる場合もありますし、別の主キー クラスになる場合もあります。

Workshop では、[プロパティ] ビューを使用してエンティティ Bean に対して使用される主キー クラスを検索することができます。そのためには、Bean のソース コードを開き、カーソルをクラス名に合わせます。[プロパティ] ビューで、Entity アノテーションの属性値がリストされている場所までスクロールして、primKeyClass 属性を検索します。この属性は、ソース コード中の @Entity アノテーションで指定されます。

エンティティ コードでは、ファインダおよび選択メソッドは @Finder アノテーション@Select アノテーションで指定します。EJB QL (クエリ言語) の詳細については、「クエリ メソッドと EJB QL」を参照してください。

関係

エンティティの関係を使用することで、ビジネス オブジェクト間の依存関係をモデリングできます。たとえば、顧客は 1 枚または複数枚のクレジット カードを持っている場合があり、製品にはメーカーがあります。2 つのエンティティ Bean 間の関係を定義すると、顧客に対して、アクセサ メソッド getCreditCards を使用して顧客のクレジット カードに簡単にアクセスできます。エンティティ関係のアクセサ メソッド (CMR フィールドのアクセサ メソッドとも呼ばれる) は、Bean のビジネス インタフェースで定義されます。

エンティティ コードでは、関係は @Relation アノテーションで指定します。詳細については、「エンティティ Bean の関係」を参照してください。

その他のメソッド

エンティティ Bean には、いくつかのコールバック メソッドの他に、特定の処理中に EJB コンテナによって呼び出される、いくつかのあらかじめ定義されたメソッドがあります。エンティティ Bean はこれらのメソッドを実装する必要があります。WebLogic では、これらのコールバック メソッドはデフォルトで自動的に実装されます。エンティティ Bean インスタンスを削除するのに使用する remove メソッドを除いて、多くの場合では、これらのメソッドを使用する必要はありません。あらかじめ定義されたメソッドと、特に remove メソッドの詳細については、「エンティティ Bean を定義する」を参照してください。コールバック メソッドの詳細については、同じトピックの「コールバック メソッド」の節、および「エンティティ Bean のライフサイクル」を参照してください。

関連トピック

weblogic.ejbgen.FileGeneration

weblogic.ejbgen.Entity


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