Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド 10g(10.1.3.1.0) B31852-03 |
|
この章では、コンテナ管理の永続性を備えたEJB 2.1エンティティBeanを使用するために構成する必要のある様々なオプションについて説明します。
表14-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。
詳細は、次を参照してください。
表14-1 EJB 2.1 CMPエンティティBeanの構成オプション
オプション | タイプ |
---|---|
基本 |
|
拡張 |
|
拡張 |
|
拡張 |
|
基本 |
|
基本 |
|
基本 |
|
基本 |
|
基本 |
|
基本 |
|
拡張 |
|
基本 |
|
拡張 |
|
基本 |
コンテナ管理の永続性を備えたすべてのEJB 2.1エンティティBeanには主キー・フィールドが必要です。
主キーは、一般的なJava型(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成」を参照)またはユーザーが作成する特殊な型
(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのコンポジット主キー・クラスの構成」を参照)として構成できます。
詳細は、「コンテナ管理の永続性を備えたエンティティBeanの主キー」を参照してください。
通常は、OC4Jによって自動的に主キー値が割り当てられます。OC4Jによる主キー値の割当て方法を構成するには、TopLink永続性APIを使用します。詳細は、次を参照してください。
コンテナ管理の永続性を備えた単純なEJB 2.1エンティティBeanの場合は、次のように主キーを一般的なJava型として定義できます。
ejbCreate
メソッドをコーディングします(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの実装」を参照)。
定義した後、コンテナはエンティティBean表に主キー用の1つまたは複数の列を作成でき、デプロイメント・ディスクリプタで定義した主キーをこの列にマッピングできます。コンテナはこの型の主キーのインスタンス化を管理し、エンティティBeanの主キー・フィールドをそれに応じて初期化します。
例14-1に、主キーを一般的なJava型Integer
として指定するように構成されているejb-jar.xml
ファイルのentity
要素の属性prim-key-class
およびprimkey-field
を示します。
<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>
主キーが一般的なJavaデータ型よりも複雑な場合は、独自の主キー・クラスを定義できます。
主キー・クラスには、次の特性が必要です。
クラスには、主キーの構成に使用するいくつかのインスタンス変数が含まれていることがあります。インスタンス変数には、次の特性が必要です。
主キー・クラスを定義したら(「Javaの使用方法」を参照)、それをエンティティBean内で使用するために、次の処理を行う必要があります。
ejbCreate
メソッドをコーディングします(「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanの実装」を参照)。
定義した後、コンテナはエンティティBean表に主キー用の1つまたは複数の列を作成でき、デプロイメント・ディスクリプタで定義した主キーをこの列にマッピングできます。コンテナはこの型の主キーのインスタンス化を管理し、エンティティBeanの主キー・フィールドをそれに応じて初期化します。
例14-2に、主キー・クラスの例を示します。
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; } }
例14-3に示すように、ejb-jar.xml
ファイルの<prim-key-class>
要素内で主キー・クラスを定義します。各主キー・クラス・インスタンス変数は、主キー・クラスで使用されるのと同じ変数名を使用して<cmp-field><field-name>
要素で定義します。
<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を使用して、次のことを実行できます。
詳細は、次を参照してください。
このリリースでは、
注意
orion-ejb-jar.xml
ファイルの<entity-deployment>
のサブ要素<cmp-field-mapping>
は使用しません。詳細は、「<entity-deployment>」を参照してください。
オブジェクトを維持するデータベース表を自動的に作成(オプションで削除)するようにOC4Jを構成できます(「デプロイXMLの使用方法」を参照)。
デフォルト・マッピングとともにこの機能を使用できます(「デフォルトの関連性生成の構成」を参照)。
自動的なデータベース表作成は、表14-2に示す3つのレベルのいずれかで構成できます。システム・レベル構成はアプリケーション・レベルでオーバーライドでき、システムおよびアプリケーション構成はEJBモジュール・レベルでオーバーライドできます。
レベル | 構成ファイル | 設定 | 値 |
---|---|---|---|
システム(グローバル) |
|
|
|
アプリケーション(EAR) |
|
|
|
EJBモジュール(JAR) |
|
|
|
1
デフォルト。 2 詳細は、「TopLink EJB 2.1永続性マネージャのカスタマイズ」を参照してください。 3 表14-3を参照してください。 |
EJBモジュール・レベルで自動的な表生成を構成する場合、表14-3に示すように、db-table-gen
属性に割り当てる値はautocreate-tables
およびautodelete-tables
設定に対応します。
db-table-gen設定 | autocreate-tables設定 | autodelete-tables設定 |
---|---|---|
|
|
|
|
|
|
|
|
NA |
デプロイ時に必要なすべての関連性を自動的に生成するようにOC4Jを構成できます
(「デプロイXMLの使用方法」を参照)。この機能を使用するには、次の処理を行う必要があります。
toplink-ejb-jar.xml
がEJBモジュールに存在しないことを確認します(「toplink-ejb-jar.xmlファイルとは」を参照)。
自動的なデータベース表作成とともにこの機能を使用できます(「自動的なデータベース表作成の構成」を参照)。
デフォルトの関連性生成を構成するには、表14-4に示すように、orion-ejb-jar.xml
ファイルの要素pm-properties
のサブ要素default-mapping
を構成します。
エントリ | 説明 |
---|---|
|
マッピングされるデータベース表を準備するためにTopLinkが行うことを決定するオプションの要素。有効な値は次のとおりです。
この設定により、
|
|
生成された表名が短すぎて一意にならない場合に使用される要素。値は デフォルト・マッピングでは、各エンティティが1つの表にマッピングされます。唯一の例外は、ソース・エンティティとターゲット・エンティティに追加の関連表が1つ含まれる多対多マッピングです。
ただし、アプリケーションの複数のJARファイルまたは複数のアプリケーションに同じエンティティが定義されている場合、表のネーミングの競合は避けられません。
この問題に対処するには、
|
エンティティ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
で判断されるように小文字で始まる必要があります。
注意
このリリースでは、 |
アクセッサ・メソッドは、デプロイメント・ディスクリプタで指定されるcmp-field
の名前を持つ必要があり、cmp-field
の名前の最初の文字は大文字で、get
またはset
という接頭辞が付いている必要があります。
詳細は、「コンテナ管理の永続性フィールドとは」を参照してください。
例14-4に、ejb-jar.xml
ファイル(「デプロイXMLの使用方法」を参照)で指定されたコンテナ管理の永続性フィールドの抽象getterおよびsetterメソッドを示します。
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);
...
}
例14-5に、Beanクラスで指定されたgetterおよびsetterメソッド(「Javaの使用方法」を参照)のcmp-field
要素を示します。
<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>
エンティティ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を使用して、コンテナ管理の関連性フィールドをリレーショナル・スキーマにマッピングする方法を構成できます。詳細は、次を参照してください。
例14-6に、ejb-jar.xml
ファイル(「デプロイXMLの使用方法」を参照)で指定されたコンテナ管理の関連性フィールドの抽象getterおよびsetterメソッドを示します。
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();
...
}
例14-7に、Beanクラスで指定されたgetterおよびsetterメソッド(「Javaの使用方法」を参照)のcmr-field
要素を示します。
...
<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関連では、エンティティBeanの1つのインスタンスが別のエンティティBeanの1つのインスタンスに関連付けられます。
コンテナ管理の1対1関連は、ejb-jar.xml
デプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。
詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。
例14-8に、Order
とShippingAddress
間の単方向の1対1関連を定義する<ejb-relationship-role>
要素のペアを示します。双方向の関連の場合、適切なcmr-field
をShippingAddress
の<ejb-relationship-role>
に追加します。
...
<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対多関連では、エンティティBeanの1つのインスタンスが別のエンティティBeanの複数のインスタンスに関連付けられます。
コンテナ管理の1対多関連は、ejb-jar.xml
デプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。
詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。
例14-9に、Order
とLineItem
間の双方向の1対多関連を定義する<ejb-relationship-role>
要素のペアを示します。単方向の関連の場合、適切な<ejb-relationship-role>
要素からcmr-field
を削除します。
...
<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関連では、エンティティBeanの複数のインスタンスが別のエンティティBeanの1つのインスタンスに関連付けられます。この多重度は、1対多関連の場合と正反対です。
コンテナ管理の多対1関連は、ejb-jar.xml
デプロイメント・ディスクリプタで指定します(「デプロイXMLの使用方法」を参照)。
詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanにおけるコンテナ管理の関連性フィールドの構成」を参照してください。
例14-10に、Employees
とDepartment
間の双方向の多対1関連を定義する<ejb-relationship-role>
要素のペアを示します。単方向の関連の場合、適切な<ejb-relationship-role>
要素からcmr-field
を削除します。
...
<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におけるコンテナ管理の関連性フィールドの構成」を参照してください。
例14-11に、Teams
とPlayers
間の多対多関連を定義する<ejb-relationship-role>
要素のペアを示します。
...
<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メソッドでは、1つ以上のオブジェクトが取得されます。デフォルト(遅延ロードの設定は「NO」)を使用する場合は、finderメソッドによって、単一のSQL select文がデータベースに対して実行されます。コンテナ管理の永続性を備えたエンティティBeanの場合、1つ以上のオブジェクトがそのすべてのコンテナ管理の永続性フィールドとともに取得されます。このため、たとえば、findAllEmployees
メソッドを実行した場合は、このfinderによって、すべての従業員オブジェクトが各従業員オブジェクトのすべてのコンテナ管理の永続性フィールドとともに取得されます。
遅延ロードをオンにすると、finder内で取得されたオブジェクトの主キーのみが戻されます。その後、実装内でオブジェクトにアクセスしたときのみ、OC4Jによって、実際のオブジェクトが主キーに基づいてアップロードされます。findAllEmployees
finderメソッドの例では、すべての従業員の主キーがCollection
に戻されます。Collection
内のいずれかの従業員に初めてアクセスすると、OC4Jでは、主キーを使用してデータベースから単一の従業員オブジェクトが取得されます。取得するオブジェクト数が大量で、ローカル・キャッシュにすべてロードするとパフォーマンスが低下する恐れがある場合は、遅延ロード機能をオンにすることができます。
遅延ロードを使用する際にパフォーマンスを考慮する必要があります。複数のオブジェクトを取得しても使用するのはその中の一部である場合は、遅延ロードをオンにすることをお薦めします。また、getPrimaryKey
メソッドを通じてのみオブジェクトを使用する場合も、遅延ロードをオンにすることをお薦めします。
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>
次に、javax.ejb.EntityBean
インタフェースでの指定に従って、コンテナ管理の永続性を備えたエンティティBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドを示します(「Javaの使用方法」を参照)。
詳細は、「コンテナ管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル」を参照してください。
例14-12では、EJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの実装方法を説明します。
public void ejbActivate() {
// when bean is activated
}
|
![]() Copyright © 2002, 2008 Oracle Corporation. All Rights Reserved. |
|