ヘッダーをスキップ

Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド
10g(10.1.3.1.0)

B31852-03
目次
目次
索引
索引

戻る 次へ

14 コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの使用方法

この章では、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanを使用するために構成する必要のある様々なオプションについて説明します。

表14-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。

詳細は、次を参照してください。

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キーの構成

コンテナ管理の永続性を備えたすべてのEJB 2.1エンティティBeanには主キー・フィールドが必要です。

主キーは、一般的なJava型(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成」を参照)またはユーザーが作成する特殊な型
「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのコンポジット主キー・クラスの構成」を参照)として構成できます。

詳細は、「コンテナ管理の永続性を備えたエンティティBeanの主キー」を参照してください。

通常は、OC4Jによって自動的に主キー値が割り当てられます。OC4Jによる主キー値の割当て方法を構成するには、TopLink永続性APIを使用します。詳細は、次を参照してください。

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成

コンテナ管理の永続性を備えた単純なEJB 2.1エンティティBeanの場合は、次のように主キーを一般的なJava型として定義できます。

定義した後、コンテナはエンティティBean表に主キー用の1つまたは複数の列を作成でき、デプロイメント・ディスクリプタで定義した主キーをこの列にマッピングできます。コンテナはこの型の主キーのインスタンス化を管理し、エンティティBeanの主キー・フィールドをそれに応じて初期化します。

デプロイXMLの使用方法

例14-1に、主キーを一般的なJava型Integerとして指定するように構成されているejb-jar.xmlファイルのentity要素の属性prim-key-classおよびprimkey-fieldを示します。

例14-1    コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのInteger型主キー・フィールド用のejb-jar.xml

<enterprise-beans>
  <entity> 
    <display-name>Employee</display-name>
    <ejb-name>EmployeeBean</ejb-name>
    <local-home>employee.EmployeeLocalHome</local-home>
    <local>employee.EmployeeLocal</local>
    <ejb-class>employee.EmployeeBean</ejb-class>
    <persistence-type>Container</persistence-type>
    <prim-key-class>java.lang.Integer</prim-key-class>
    <reentrant>False</reentrant>
    <cmp-version>2.x</cmp-version>
    <abstract-schema-name>Employee</abstract-schema-name>
    <cmp-field><field-name>empNo</field-name></cmp-field>
    <cmp-field><field-name>empName</field-name></cmp-field>
    <cmp-field><field-name>salary</field-name></cmp-field>
    <primkey-field>empNo</primkey-field>
    </entity>
...
</enterprise-beans>

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのコンポジット主キー・クラスの構成

主キーが一般的なJavaデータ型よりも複雑な場合は、独自の主キー・クラスを定義できます。

主キー・クラスには、次の特性が必要です。

クラスには、主キーの構成に使用するいくつかのインスタンス変数が含まれていることがあります。インスタンス変数には、次の特性が必要です。

主キー・クラスを定義したら(「Javaの使用方法」を参照)、それをエンティティBean内で使用するために、次の処理を行う必要があります。

定義した後、コンテナはエンティティBean表に主キー用の1つまたは複数の列を作成でき、デプロイメント・ディスクリプタで定義した主キーをこの列にマッピングできます。コンテナはこの型の主キーのインスタンス化を管理し、エンティティBeanの主キー・フィールドをそれに応じて初期化します。

Javaの使用方法

例14-2に、主キー・クラスの例を示します。

例14-2    コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・クラスの実装

package employee;

import java.io.*;
import java.io.Serializable;
...

public class EmployeePK implements java.io.Serializable {
  public Integer empNo;

  public EmployeePK() {
    this.empNo = null;
  }

  public EmployeePK(Integer empNo) {
    this.empNo = empNo;
  }
}

デプロイXMLの使用方法

例14-3に示すように、ejb-jar.xmlファイルの<prim-key-class>要素内で主キー・クラスを定義します。各主キー・クラス・インスタンス変数は、主キー・クラスで使用されるのと同じ変数名を使用して<cmp-field><field-name>要素で定義します。

例14-3    コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・クラスおよびそのインスタンス変数のejb-jar.xml

<enterprise-beans>
  <entity>
    <description>no description</description>
    <display-name>EmployeeBean</display-name>
         <ejb-name>EmployeeBean</ejb-name>
         <local-home>employee.LocalEmployeeHome</home>
         <local>employee.LocalEmployee</remote>
         <ejb-class>employee.EmployeeBean</ejb-class>
         <persistence-type>Container</persistence-type>
        <prim-key-class>employee.EmployeePK</prim-key-class>
         <reentrant>False</reentrant>
         <cmp-version>2.x</cmp-version>
         <abstract-schema-name>Employee</abstract-schema-name>
        <cmp-field><field-name>empNo</field-name></cmp-field>
         <cmp-field><field-name>empName</field-name></cmp-field>
         <cmp-field><field-name>salary</field-name></cmp-field>
      </entity>
</enterprise-beans>

定義した後、コンテナはエンティティBean表に主キー用の1つまたは複数の列を作成でき、デプロイメント・ディスクリプタで定義した主キー・クラスをこの列にマッピングできます。

表および列情報の構成

EJB 2.1仕様には、エンティティBeanの抽象永続性スキーマを永続ストアのリレーショナル・スキーマ(またはその他のスキーマ)にマッピングする方法や、そのようなマッピングの記述方法は規定されていません。

ただし、OC4JおよびTopLink永続性APIを使用して、次のことを実行できます。

詳細は、次を参照してください。

自動的なデータベース表作成の構成

オブジェクトを維持するデータベース表を自動的に作成(オプションで削除)するようにOC4Jを構成できます(「デプロイXMLの使用方法」を参照)。

デフォルト・マッピングとともにこの機能を使用できます(「デフォルトの関連性生成の構成」を参照)。

デプロイXMLの使用方法

自動的なデータベース表作成は、表14-2に示す3つのレベルのいずれかで構成できます。システム・レベル構成はアプリケーション・レベルでオーバーライドでき、システムおよびアプリケーション構成はEJBモジュール・レベルでオーバーライドできます。

表14-2    自動的な表生成の構成 
レベル  構成ファイル  設定   

システム(グローバル) 

<OC4J_HOME>/config/application.xml 

autocreate-tables

autodelete-tables 

True1またはFalse

TrueまたはFalse1 

アプリケーション(EAR) 

orion-application.xml 

autocreate-tables

autodelete-tables 

True1またはFalse

TrueまたはFalse1 

EJBモジュール(JAR) 

orion-ejb-jar.xml 

pm-propertiesのサブ要素default-mappingの属性db-table-gen2 

CreateDropAndCreateまたはUseExisting3 

1 デフォルト。

2 詳細は、「TopLink EJB 2.1永続性マネージャのカスタマイズ」を参照してください。

3 表14-3を参照してください。

EJBモジュール・レベルで自動的な表生成を構成する場合、表14-3に示すように、db-table-gen属性に割り当てる値はautocreate-tablesおよびautodelete-tables設定に対応します。

表14-3    db-table-genの同等の設定 
db-table-gen設定  autocreate-tables設定  autodelete-tables設定 

Create 

True 

False 

DropAndCreate 

True 

True 

UseExisting 

False 

NA 

デフォルトの関連性生成の構成

デプロイ時に必要なすべての関連性を自動的に生成するようにOC4Jを構成できます
「デプロイXMLの使用方法」を参照)。この機能を使用するには、次の処理を行う必要があります。

自動的なデータベース表作成とともにこの機能を使用できます(「自動的なデータベース表作成の構成」を参照)。

デプロイXMLの使用方法

デフォルトの関連性生成を構成するには、表14-4に示すように、orion-ejb-jar.xmlファイルの要素pm-propertiesのサブ要素default-mappingを構成します。

表14-4    デフォルト・マッピングのorion-ejb-jar.xmlファイルのpm-propertiesサブエントリ 
エントリ  説明 

db-table-gen 

マッピングされるデータベース表を準備するためにTopLinkが行うことを決定するオプションの要素。有効な値は次のとおりです。

  • Create(デフォルト): この値は、デプロイ時にマッピングされる表を作成するようTopLinkに指示します。表がすでに存在する場合、TopLinkは適切な警告メッセージ(「表はすでに存在しています...」など)をログに記録し、デプロイを続行します。

  • DropAndCreate: この値は、デプロイ時に表を作成する前に表を削除するようTopLinkに指示します。最初に表が存在しない場合に削除操作を実行すると、ドライバを通じてSQLExceptionがスローされます。ただし、TopLinkは例外を処理(ログに記録して無視)し、表作成操作の処理に進みます。デプロイは、削除操作と作成操作の両方が失敗した場合にのみ失敗します。

  • UseExisting: この値は、表操作を実行しないようTopLinkに指示します。表が存在しない場合も、デプロイはエラーなしで実行されます。

orion-ejb-jar.xmlファイルがEARファイルで定義されていない場合は、OC4Jコンテナがデプロイ時にこれを生成します。この場合、db-table-genの値を指定するには、TopLinkのシステム・プロパティtoplink.defaultmapping.dbTableGenSettingを使用します。たとえば、-Dtoplink.defaultmapping.dbTableGenSetting="DropAndCreate"などです。

orion-ejb-jar.xmlプロパティは、システム・プロパティをオーバーライドします。orion-ejb-jar.xmlプロパティとシステム・プロパティの両方が存在する場合、TopLinkはorion-ejb-jar.xmlファイルから設定を取得します。

この設定により、autocreate-tablesおよびautodelete-tables構成がアプリケーション(EAR)レベルまたはシステム・レベルでオーバーライドされます。詳細は、「自動的なデータベース表作成の構成」を参照してください。

 

extended-table-names 

生成された表名が短すぎて一意にならない場合に使用される要素。値はtrueまたはfalse(デフォルト)に制限されます。trueに設定されている場合、TopLinkランタイムは生成された表名が一意であることを確認します。

デフォルト・マッピングでは、各エンティティが1つの表にマッピングされます。唯一の例外は、ソース・エンティティとターゲット・エンティティに追加の関連表が1つ含まれる多対多マッピングです。

extended-table-namesfalse(デフォルト)に設定されている場合、単純な表ネーミング・アルゴリズムが使用されます。つまり、表名はTL_<bean_name>として定義されます。たとえば、Bean名がEmployeeの場合、関連付けられている表名はTL_EMPLOYEEになります。

ただし、アプリケーションの複数のJARファイルまたは複数のアプリケーションに同じエンティティが定義されている場合、表のネーミングの競合は避けられません。

この問題に対処するには、extended-table-namestrueに設定します。trueに設定されている場合、TopLinkは別の表ネーミング・アルゴリズムを使用します。つまり、表名は<bean_name>_<jar_name>_<app_name>として定義されます。このアルゴリズムでは、Bean、JARおよびEAR名の組合せを使用して、アプリケーション全体で一意の表名を形成します。たとえば、Demo.ear(アプリケーション名はDemo)にあるTest.jar内にEmployeeという名前のBeanがある場合、対応する表名はEMPLOYEE_TEST_DEMOになります。

orion-ejb-jar.xmlファイルがEARファイルで定義されていない場合は、OC4Jコンテナがデプロイ時にこれを生成します。この場合、extended-table-namesの値を指定するには、TopLinkのシステム・プロパティtoplink.defaultmapping.useExtendedTableNamesを使用します。たとえば、-Dtoplink.defaultmapping.useExtendedTableNames="true"などです。

orion-ejb-jar.xmlプロパティは、システム・プロパティをオーバーライドします。orion-ejb-jar.xmlプロパティとシステム・プロパティの両方が存在する場合、TopLinkはorion-ejb-jar.xmlファイルから設定を取得します。 

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の永続性フィールドの構成

エンティティBeanクラスにはコンテナ管理の永続性フィールドを定義しません。コンテナ管理の永続性フィールドは仮想のみです。OC4Jでは、コンテナ管理の永続性フィールドの実装が提供されます。

EJB表記規則(「Javaの使用方法」を参照)を使用して、public abstractのgetterおよびsetterメソッドをコンテナ管理の永続性フィールドに対して定義する必要があります。OC4Jでは、これらのメソッドの実装が提供されます。これらのgetterおよびsetterメソッドは、エンティティBeanのリモート・インタフェースに公開しないでください。

コンテナ管理の永続性フィールドには、Javaプリミティブ型およびJavaシリアライズ可能型のみ割り当てることができます。エンティティBeanのローカル・インタフェース型(またはそのコレクション)をコンテナ管理の永続性フィールドに割り当てることはできません。

コンテナ管理の永続性フィールドは、cmp-field要素を使用してejb-jar.xmlデプロイメント・ディスクリプタで指定する必要があります(「デプロイXMLの使用方法」を参照)。これらのフィールドの名前は、有効なJava識別子である必要があり、java.lang.Character.isLowerCaseで判断されるように小文字で始まる必要があります。


注意

このリリースでは、orion-ejb-jar.xmlファイルの<entity-deployment>のサブ要素<cmp-field-mapping>は使用しません。詳細は、「<entity-deployment>」を参照してください。 


アクセッサ・メソッドは、デプロイメント・ディスクリプタで指定されるcmp-fieldの名前を持つ必要があり、cmp-fieldの名前の最初の文字は大文字で、getまたはsetという接頭辞が付いている必要があります。

詳細は、「コンテナ管理の永続性フィールドとは」を参照してください。

Javaの使用方法

例14-4に、ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)で指定されたコンテナ管理の永続性フィールドの抽象getterおよびsetterメソッドを示します。

例14-4    EJB 2.1コンテナ管理の永続性フィールド

package cmpapp;

import javax.ejb.*;
import java.rmi.*;

public abstract class EmployeeBean implements EntityBean {

    private EntityContext ctx;

    // container-managed persistent fields accessors
    public abstract Integer getEmpNo();
    public abstract void setEmpNo(Integer empNo);

    public abstract String getEmpName();
    public abstract void setEmpName(String empName);

    public abstract Float getSalary();
    public abstract void setSalary(Float salary);
...
}

デプロイXMLの使用方法

例14-5に、Beanクラスで指定されたgetterおよびsetterメソッド(「Javaの使用方法」を参照)のcmp-field要素を示します。

例14-5    EJB 2.1コンテナ管理の永続性フィールドのejb-jar.xml

    <enterprise-beans>
        <entity>
            <ejb-name>Topic</ejb-name>
            <local-home>faqapp.TopicLocalHome</local-home>
            <local>faqapp.TopicLocal</local>
            <ejb-class>faqapp.TopicBean</ejb-class>
            <persistence-type>Container</persistence-type>
            <prim-key-class>java.lang.Integer</prim-key-class>
            <primkey-field>topicID</primkey-field>
            <reentrant>False</reentrant>
            <cmp-version>2.x</cmp-version>
            <abstract-schema-name>TopicBean</abstract-schema-name>
            <cmp-field>
                <field-name>topicID</field-name>
            </cmp-field>
            <cmp-field>
                <field-name>topicDesc</field-name>
            </cmp-field>
            ...
        </entity>
    </enterprise-beans>

 

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成

エンティティBeanクラスにはコンテナ管理の関連性フィールドを定義しません。コンテナ管理の関連性フィールドは仮想のみです。OC4Jでは、コンテナ管理の関連性フィールドの実装が提供されます。

EJB表記規則(「Javaの使用方法」を参照)を使用して、関連するエンティティBeanのローカル・インタフェースでpublic abstractのgetterおよびsetterメソッドをコンテナ管理の関連性フィールドに対して定義する必要があります。OC4Jでは、これらのメソッドの実装が提供されます。これらのgetterおよびsetterメソッドは、エンティティBeanのリモート・インタフェースに公開しないでください。

コンテナ管理の関連性フィールドには、Javaプリミティブ型およびJavaシリアライズ可能型のみ割り当てることができます。コンテナ管理の関連性フィールドには、エンティティBeanのローカル・インタフェース型(またはそのコレクション)を割り当てることができます。

コンテナ管理の関連性フィールドは、cmr-field要素を使用してejb-jar.xmlデプロイメント・ディスクリプタで指定する必要があります(「デプロイXMLの使用方法」を参照)。これらのフィールドの名前は、有効なJava識別子である必要があり、java.lang.Character.isLowerCaseで判断されるように小文字で始まる必要があります。

アクセッサ・メソッドは、デプロイメント・ディスクリプタで指定されるコンテナ管理の関連性フィールド(cmr-field)の名前を持つ必要があり、cmr-fieldの名前の最初の文字は大文字で、getまたはsetという接頭辞が付いている必要があります。

1対多または多対多関連のコンテナ管理の関連性フィールドのアクセッサ・メソッドでは、java.util.Collectionまたはjava.util.Setのいずれかのコレクション・インタフェースを利用する必要があります。関連で使用されるコレクション・インタフェースは、デプロイメント・ディスクリプタで指定されます。コンテナ管理の関連性フィールドに使用されるコレクション・クラスの実装は、コンテナにより提供されます。コンテナ管理の関連性に使用されるコレクション・クラスは、エンティティBeanのリモート・インタフェースを通じて公開しないでください。

詳細は、次を参照してください。

OC4JおよびTopLink永続性APIを使用して、コンテナ管理の関連性フィールドをリレーショナル・スキーマにマッピングする方法を構成できます。詳細は、次を参照してください。

Javaの使用方法

例14-6に、ejb-jar.xmlファイル(「デプロイXMLの使用方法」を参照)で指定されたコンテナ管理の関連性フィールドの抽象getterおよびsetterメソッドを示します。

例14-6    EJB 2.1コンテナ管理の関連性フィールド

package cmpapp;

import javax.ejb.*;
import java.rmi.*;

public abstract class EmployeeBean implements EntityBean {

    private EntityContext ctx;

    // container-managed persistent fields accessors
    public abstract Integer getEmpNo();
    public abstract void setEmpNo(Integer empNo);

    public abstract String getEmpName();
    public abstract void setEmpName(String empName);

    public abstract Float getSalary();
    public abstract void setSalary(Float salary);

    public abstract void setProjects(Collection projects);
    public abstract Collection getProjects();
...
}

 

デプロイXMLの使用方法

例14-7に、Beanクラスで指定されたgetterおよびsetterメソッド(「Javaの使用方法」を参照)のcmr-field要素を示します。

例14-7    EJB 2.1コンテナ管理の関連性フィールドのejb-jar.xml

...
    <relationships>
        <ejb-relation>
            <ejb-relation-name>Topic-Faqs</ejb-relation-name>
            <ejb-relationship-role>
                <ejb-relationship-role-name>Topic-has-Faqs</ejb-relationship-role-name>
                <multiplicity>Many</multiplicity>
                <relationship-role-source>
                    <ejb-name>TopicBean</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <cmr-field-name>faqs</cmr-field-name>
                    <cmr-field-type>java.util.Collection</cmr-field-type>
                </cmr-field>
            </ejb-relationship-role>
        <ejb-relation>
...
    <relationships>

 

1対1関連の構成

1対1関連では、エンティティBeanの1つのインスタンスが別のエンティティBeanの1つのインスタンスに関連付けられます。

コンテナ管理の1対1関連は、ejb-jar.xmlデプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。

詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。

デプロイXMLの使用方法

例14-8に、OrderShippingAddress間の単方向の1対1関連を定義する<ejb-relationship-role>要素のペアを示します。双方向の関連の場合、適切なcmr-fieldShippingAddress<ejb-relationship-role>に追加します。

例14-8    EJB 2.1の単方向1対1関連のejb-jar.xml

...
<relationships>
    <ejb-relation>
        <ejb-relation-name>Order-ShippingAddress</ejb-relation-name>
        <ejb-relationship-role>
            <ejb-relationship-role-name>order-has-address</ejb-relationship-role-name>
            <multiplicity>One</multiplicity>
            <relationship-role-source>
                <ejb-name>OrderEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>shippingAddress</cmr-field-name>
            </cmr-field>
        </ejb-relationship-role>
        <ejb-relationship-role>
            <ejb-relationship-role-name>address-for-order</ejb-relationship-role-name>
            <multiplicity>One</multiplicity>
            <relationship-role-source>
                <ejb-name>AddressEJB</ejb-name>
            </relationship-role-source>
        </ejb-relationship-role>
    </ejb-relation>
...
<relationships>

 

1対多関連の構成

1対多関連では、エンティティBeanの1つのインスタンスが別のエンティティBeanの複数のインスタンスに関連付けられます。

コンテナ管理の1対多関連は、ejb-jar.xmlデプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。

詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。

デプロイXMLの使用方法

例14-9に、OrderLineItem間の双方向の1対多関連を定義する<ejb-relationship-role>要素のペアを示します。単方向の関連の場合、適切な<ejb-relationship-role>要素からcmr-fieldを削除します。

例14-9    EJB 2.1の双方向1対多関連のejb-jar.xml

...
<relationships>
    <ejb-relation>
        <ejb-relation-name>Order-LineItem</ejb-relation-name>
        <ejb-relationship-role>
            <ejb-relationship-role-name>order-has-lineitems</ejb-relationship-role-name>
            <multiplicity>One</multiplicity>
            <relationship-role-source>
                <ejb-name>OrderEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>lineItems</cmr-field-name>
                <cmr-field-type>java.util.Collection</cmr-field-type>
            </cmr-field>
        </ejb-relationship-role>
        <ejb-relationship-role>
            <ejb-relationship-role-name>lineitem-belongsto-order</ejb-relationship-role-name>
            <multiplicity>Many</multiplicity>
            <cascade-delete/>
            <relationship-role-source>
                <ejb-name>LineItemEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>order</cmr-field-name>
            </cmr-field>
        </ejb-relationship-role>
    </ejb-relation>
...
<relationships>

 

多対1関連の構成

多対1関連では、エンティティBeanの複数のインスタンスが別のエンティティBeanの1つのインスタンスに関連付けられます。この多重度は、1対多関連の場合と正反対です。

コンテナ管理の多対1関連は、ejb-jar.xmlデプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。

詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。

デプロイXMLの使用方法

例14-10に、EmployeesDepartment間の双方向の多対1関連を定義する<ejb-relationship-role>要素のペアを示します。単方向の関連の場合、適切な<ejb-relationship-role>要素からcmr-fieldを削除します。

例14-10    EJB 2.1の双方向多対1関連のejb-jar.xml

...
<relationships>
    <ejb-relation>
        <ejb-relation-name>Employee-Department</ejb-relation-name>
        <ejb-relationship-role>
            <ejb-relationship-role-name>employees-belongto-dept</ejb-relationship-role-name>
            <multiplicity>Many</multiplicity>
            <relationship-role-source>
                <ejb-name>DepartmentEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>dept</cmr-field-name>
            </cmr-field>
        </ejb-relationship-role>
        <ejb-relationship-role>
            <ejb-relationship-role-name>dept-has-employees</ejb-relationship-role-name>
            <multiplicity>One</multiplicity>
            <cascade-delete/>
            <relationship-role-source>
                <ejb-name>LineItemEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>employees</cmr-field-name>
                <cmr-field-type>java.util.Collection</cmr-field-type>
            </cmr-field>
        </ejb-relationship-role>
    </ejb-relation>
...
<relationships>

 

多対多関連の構成

多対多関連では、エンティティBeanの複数のインスタンスが別のエンティティBeanの複数のインスタンスに関連付けられます。

コンテナ管理の多対多関連は、ejb-jar.xmlデプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。

詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。

デプロイXMLの使用方法

例14-11に、TeamsPlayers間の多対多関連を定義する<ejb-relationship-role>要素のペアを示します。

例14-11    EJB 2.1の多対多関連のejb-jar.xml

...
<relationships>
    <ejb-relation>
        <ejb-relationship-role>
            <ejb-relationship-role-name>team-has-players</ejb-relationship-role-name>
            <multiplicity>Many</multiplicity>
            <relationship-role-source>
                <ejb-name>TeamEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>players</cmr-field-name>
                <cmr-field-type>java.util.Collection</cmr-field-type>
            </cmr-field>
        </ejb-relationship-role>
        <ejb-relationship-role>
            <ejb-relationship-role-name>player-has-teams</ejb-relationship-role-name>
            <multiplicity>Many</multiplicity>
            <relationship-role-source>
                <ejb-name>PlayerEJB</ejb-name>
            </relationship-role-source>
            <cmr-field>
                <cmr-field-name>teams</cmr-field-name>
                <cmr-field-type>java.util.Collection</cmr-field-type>
            </cmr-field>
        </ejb-relationship-role>
    </ejb-relation>
...
<relationships>

 

finderメソッドにおける遅延ロードの構成

各finderメソッドでは、1つ以上のオブジェクトが取得されます。デフォルト(遅延ロードの設定は「NO」)を使用する場合は、finderメソッドによって、単一のSQL select文がデータベースに対して実行されます。コンテナ管理の永続性を備えたエンティティBeanの場合、1つ以上のオブジェクトがそのすべてのコンテナ管理の永続性フィールドとともに取得されます。このため、たとえば、findAllEmployeesメソッドを実行した場合は、このfinderによって、すべての従業員オブジェクトが各従業員オブジェクトのすべてのコンテナ管理の永続性フィールドとともに取得されます。

遅延ロードをオンにすると、finder内で取得されたオブジェクトの主キーのみが戻されます。その後、実装内でオブジェクトにアクセスしたときのみ、OC4Jによって、実際のオブジェクトが主キーに基づいてアップロードされます。findAllEmployees finderメソッドの例では、すべての従業員の主キーがCollectionに戻されます。Collection内のいずれかの従業員に初めてアクセスすると、OC4Jでは、主キーを使用してデータベースから単一の従業員オブジェクトが取得されます。取得するオブジェクト数が大量で、ローカル・キャッシュにすべてロードするとパフォーマンスが低下する恐れがある場合は、遅延ロード機能をオンにすることができます。

遅延ロードを使用する際にパフォーマンスを考慮する必要があります。複数のオブジェクトを取得しても使用するのはその中の一部である場合は、遅延ロードをオンにすることをお薦めします。また、getPrimaryKeyメソッドを通じてのみオブジェクトを使用する場合も、遅延ロードをオンにすることをお薦めします。

デプロイXMLの使用方法

findByPrimaryKeyメソッドで遅延ロードをオンにするには、次のようにfindByPrimaryKey-lazy-loading属性をtrueに設定します。

<entity-deployment ... findByPrimaryKey-lazy-loading="true" ... >

カスタムのfinderメソッドで遅延ロードをオンにするには、次のように、そのカスタムのfinderに対する<finder-method>要素のlazy-loading属性をtrueに設定します。

<finder-method ... lazy-loading="true" ...>
  ...
</finder-method>

コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの構成

次に、javax.ejb.EntityBeanインタフェースでの指定に従って、コンテナ管理の永続性を備えたエンティティBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドを示します(「Javaの使用方法」を参照)。

詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル」を参照してください。

Javaの使用方法

例14-12では、EJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの実装方法を説明します。

例14-12    EJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの実装

public void ejbActivate() {
    // when bean is activated
}



戻る 次へ
Oracle
Copyright © 2002, 2008 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引