エンティティ Bean の定義

このトピックでは、エンティティ Bean の作成方法、およびエンティティ Bean で必要な最低限の定義について説明します。さらに、Bean インスタンスの削除方法、およびエンティティ Bean によって拡張されるさまざまなインタフェースについて説明します。このトピックの内容は以下のとおりです。


エンティティ Bean の作成

[WebLogic エンティティ Bean] ウィザードを使用すると、エンティティ Bean をゼロから簡単に作成できます。WebLogic EJB プロジェクトで新しいエンティティ Bean を設計する場合は、このウィザードを使用してテンプレートから基本エンティティ Bean コードを作成します。ウィザードを使用するには、Workshop で、[WebLogic EJB プロジェクト] フォルダを右クリックし、[新規] を選択して [WebLogic エンティティ Bean] をクリックします。

新しい Bean の作成方法の詳細については、「チュートリアル : エンタープライズ JavaBean の構築」を参照してください。新しいエンティティ Bean を作成する場合、デフォルトでローカル インタフェースとさまざまなその他のデフォルト値が定義されます。詳細については、「weblogic.ejbgen.FileGeneration」を参照してください。

注意 :複数の既存のエンティティ Bean を、たとえば別の EJB や EJB コントロールを介してアプリケーションで呼び出す予定があるが、それらの定義を変更するつもりがない場合は、アプリケーションに EJB Jar を追加するだけで十分です。

自動テーブル作成

新しいエンティティ Bean の開発時は、自動テーブル作成を有効にすると、反復的な開発が容易になります。テーブルが存在しない場合、サーバでテーブルを自動作成できます。また、エンティティ Bean の定義がテーブルの仕様と一致しない場合には、既存のテーブルを削除して再作成できます。自動テーブル作成は、WebLogic EJB プロジェクトのプロパティ ダイアログで有効にできます。このダイアログの左ペインで [WebLogic EJB] をクリックし、右ペインのテーブル作成ドロップダウンから値を選択します。デフォルトの設定は、CREATE_ONLY です。エンティティ Bean の定義がテーブルの仕様と一致しない場合にテーブルを再作成するには、DROP_AND_CREATE を使用します。設定の詳細については、「weblogic.ejbgen.JarSettings」を参照してください。

注意 : 自動テーブル作成は、開発を容易にするためのものであり、プロダクション モードでは無効です。

基本的なエンティティ Bean の定義

次の Bean は、ゼロから定義を行い、2 つの CMP フィールドを追加し、それらのいずれか 1 つを主キーとして指定して、ejbCreate メソッドを作成することによって開発されたものです。このエンティティ Bean を使用することで、新しい製品を追加したり、その主キーを使用して製品を検索したり、その CMP フィールド値を取得および設定したりできます。

package myBeans;

import javax.ejb.*;
import weblogic.ejb.*;
import weblogic.ejbgen.*;

@Entity(ejbName = "Product", 
        dataSourceName = "samplesDataSource", 
        tableName = "product", 
        abstractSchemaName = "Product", 
        primKeyClass = "String")
@AutomaticKeyGeneration(cacheSize = "1", 
        name = "NamedSequence", 
        type = AutomaticKeyGeneration.AutomaticKeyGenerationType.SEQUENCE_TABLE)
@JndiName(local = "ejb.ProductLocalHome")
@FileGeneration(localClass = Constants.Bool.TRUE, 
        localClassName = "Product", 
        localHome = Constants.Bool.TRUE, 
        localHomeName = "ProductHome", 
        remoteClass = Constants.Bool.FALSE, 
        remoteHome = Constants.Bool.FALSE, 
        remoteHomeName = "ProductRemoteHome", 
        remoteClassName = "ProductRemote", 
        valueClass = Constants.Bool.FALSE, 
        valueClassName = "ProductValue", 
        pkClass = Constants.Bool.TRUE)
abstract public class ProductBean 
    extends GenericEntityBean 
    implements EntityBean {
    @CmpField(column = "Name", 
            primkeyField = Constants.Bool.TRUE)
    @LocalMethod()
    public abstract String getName();

    @LocalMethod()
    public abstract void setName(String arg);

    @CmpField(column = "Price")
    @LocalMethod()
    public abstract double getPrice();

    @LocalMethod()
    public abstract void setPrice(double arg);

    public java.lang.String ejbCreate(java.lang.String Name, double Price) {
        setName(Name);
        setPrice(Price);

        return null; // FIXME は PK 値を返す
    }

    public void ejbPostCreate(java.lang.String Name, double Price) {
    }
}

Workshop では、エンティティ Bean の作成に必要なすべての情報は、Bean クラス、ローカル ビジネス インタフェース、ローカル ホーム インタフェース、その主キー クラスなどについて個別の JAVA ファイルに格納されるのではなく、単一のファイルに格納されます。EJB をビルドすると、これらのその他のクラスは自動的に生成されます。Workshop は、ソース コード中の ejbgen アノテーションを解釈してこれらのファイルを生成します。たとえば、@FileGeneration アノテーションは、ProductBean のローカル ホームおよびビジネス インタフェースの名前を指定します。アクセサ メソッドの @LocalMethod アノテーションは、これらのメソッドがローカル ビジネス インタフェースで定義されることを指定します。

生成済みの JAVA ファイルは、リソース ビューで表示できます。このビューで、.apt_src フォルダを展開して、ソース パッケージに対応するフォルダを参照します。生成されたファイルは、これらのフォルダの中に存在します。ProductBean では、EJBLocalObject を拡張する Product インタフェースと、EJBLocalHome を拡張する ProductHome インタフェースが存在します。プロジェクトのビルド フォルダを展開することで、生成されたファイルからコンパイルされた CLASS ファイルを (リソース ビューで) 参照できます。

ProductBean で複数の主キーが使用される場合には、複合主キー クラスの定義を格納する ProductBeanPK.java ファイルも自動生成されます。

エンティティ Bean インスタンスの削除

エンティティ Bean には、新しいインスタンスを作成する、少なくとも 1 つの ejbCreate メソッドを定義する必要があります。また、EJB コンテナによって、findByPrimaryKey メソッドがホーム インタフェースに自動的に定義されます。このメソッドは、メソッド パラメータである主キー (クラス) を使用する Bean インスタンスを返します。さらに、Bean のインタフェースのすべてが各種の便利なメソッドを含む特定のインタフェースを拡張します。これには、以下のものがあります。

これらのインタフェースおよびそれらが定義するメソッドの詳細については、お好きな J2EE ドキュメントおよび http://java.sun.com の API リファレンスを参照してください。これらのインタフェースによって提供されるメソッドの中で頻繁に使用されるものの 1 つが remove メソッドです。このメソッドは、エンティティ Bean インスタンスの削除に使用されます。つまり、エンティティ Bean で remove メソッドを呼び出すと、Bean とデータベースの基底のレコードが削除されます。

remove メソッドはすべてのインタフェースで定義されます。たとえば、ローカル ホーム インタフェースを介して Bean インスタンスを削除するには、インスタンスの主キーをパラメータとして取る remove メソッドを呼び出すことができます。ローカル インタフェースを介して Bean インスタンスを削除するには、削除するインスタンスに対して remove メソッドを呼び出すことができます。両方の方法を以下に示します。セッション Bean のメソッド deleteViaHome は、ローカル ホーム インタフェースを介して Product Bean のインスタンスを削除します。一方、deleteViaBusiness は、ローカル インタフェースを介して Product Bean のインスタンスを削除します。

package myBeans;

import javax.ejb.*;
import javax.naming.InitialContext;
import javax.naming.NamingException;

import weblogic.ejb.*;
import weblogic.ejbgen.*;

@EjbLocalRefs( { @EjbLocalRef(link = "Product") })
@Session(ejbName = "SomeSession")
@JndiName(remote = "ejb.SomeSessionRemoteHome")
@FileGeneration(remoteClass = Constants.Bool.TRUE, 
        remoteHome = Constants.Bool.TRUE, 
        localClass = Constants.Bool.TRUE, 
        localHome = Constants.Bool.TRUE, 
        localClassName = "SomeSessionLocal", 
        localHomeName = "SomeSessionLocalHome")
public class SomeSession extends GenericSessionBean 
    implements SessionBean {
    private static final long serialVersionUID = 1L;

    @LocalMethod()
    public void deleteViaHome(String thePk) {
        try {
            javax.naming.Context ic = new InitialContext();
            ProductHome productHome = (ProductHome) ic
                    .lookup("java:comp/env/ejb/Product");
            productHome.remove(thePk);
        } catch (NamingException ne) {
            // 例外処理コード。
        } catch (RemoveException re) {
            // 例外処理コード。
        }
    }

    @LocalMethod()
    public void deleteViaBusiness(String thePk) {
        try {
            javax.naming.Context ic = new InitialContext();
            ProductHome productHome = (ProductHome) ic
                    .lookup("java:comp/env/ejb/Product");
            Product theProduct = productHome.findByPrimaryKey(thePk);
            theProduct.remove();
        } catch (NamingException ne) {
            // 例外処理コード。
        } catch (FinderException ne) {
            // 例外処理コード。
        } catch (RemoveException re) {
            // 例外処理コード。        }
    }

    public void ejbCreate() {
        // Bean 初期化コードをここに記述する。
    }

}

コールバック メソッド

すべてのエンティティ Bean は javax.ejb.EntityBean インタフェースを実装する必要があります。このインタフェースは、特定の時点で EJB コンテナによって呼び出されるコールバック メソッドを定義します。コールバック メソッドは、setEntityContextunsetEntityContextejbActivateejbPassivateejbLoadejbStore、および ejbRemove です。エンティティ Bean をゼロから、またはデータベース テーブルから定義する場合は、これらのコールバック メソッドの空の実装を含む weblogic.ejb.GenericEntityBean を拡張します。つまり、空の実装をオーバーライドする必要がある場合にのみ、これらのメソッドを定義する必要があります。エンティティ Bean をインポートする場合は、これらのコールバック メソッドは Bean のソース ファイルに直接実装されるばずです。

コールバック メソッド、およびエンティティ Bean と EJB コンテナ間での対話におけるその役割の詳細については、「エンティティ Bean のライフサイクル」を参照してください。

関連トピック

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

weblogic.ejbgen.FileGeneration

weblogic.ejbgen.LocalMethod


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