Oracle Containers for J2EE Enterprise JavaBeans開発者ガイド 10g(10.1.3.1.0) B31852-03 |
|
この章では、Bean管理の永続性を備えたEJB 2.1エンティティBeanを使用するために構成する必要のある様々なオプションについて説明します。
表15-1に、これらのオプションをリストし、基本オプション(ほとんどのアプリケーションに適用可能)であるか拡張オプション(より特殊なアプリケーションに適用可能)であるかを示します。
詳細は、次を参照してください。
表15-1 Bean管理の永続性を備えたEJB 2.1エンティティBeanの構成オプション
オプション | タイプ |
---|---|
基本 |
|
拡張 |
|
拡張 |
|
基本 |
|
基本 |
Bean管理の永続性を備えたすべてのEJB 2.1エンティティBeanには主キー・フィールドが必要です。
主キーは、一般的なJava型(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの主キー・フィールドの構成」を参照)またはユーザーが作成する特殊な型(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの主キー・クラスの構成」を参照)として構成できます。
詳細は、「Bean管理の永続性を備えたエンティティBeanの主キー」を参照してください。
Bean管理の永続性を備えたEJB 2.1エンティティBeanの場合、通常はejbCreate
メソッドでユーザーが主キー値を割り当てます(「Bean管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの構成」を参照)。
Bean管理の永続性を備えた単純なEJB 2.1エンティティBeanの場合は、次のように主キーを一般的なJava型として定義できます。
ejbCreate
メソッドをコーディングします(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの実装」を参照)。
例15-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>Bean</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データ型よりも複雑な場合は、独自の主キー・クラスを定義できます。
主キー・クラスには、次の特性が必要です。
クラスには、主キーの構成に使用するいくつかのインスタンス変数が含まれていることがあります。インスタンス変数には、次の特性が必要です。
hashCode()
およびequals(Object)
メソッドの適切な実装を提供する型
主キー・クラスを定義したら(「Javaの使用方法」を参照)、それをEJB内で使用するために、次の処理を行う必要があります。
ejbCreate
メソッドをコーディングします(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの実装」を参照)。
例15-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; } }
例15-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>Bean</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は読取り専用として構成できます。これにより、OC4Jと取決めを行い、コンテナ管理の永続性を備えたエンティティBeanの状態がアクティブ化の後も変化しないことを保証できます。コンテナ管理の永続性を備えた読取り専用エンティティBeanとは異なり、Bean管理の永続性を備えた読取り専用Beanを更新しても例外はスローされません。
Bean管理の永続性を備えたエンティティBeanを読取り専用として構成した場合、OC4Jはコミット・オプションA(「Bean管理の永続性を備えたエンティティBeanのコミット・オプションの構成」を参照)の特殊ケースを使用して次のようにパフォーマンスを向上させます。
図15-1に示すように、主キーによってBean管理の永続性を備えた同じ読取り専用エンティティBeanにアクセスする複数のクライアントには、1つのインスタンスが割り当てられます。クライアント1とクライアント2の両方が、Bean管理の永続性を備えた読取り専用エンティティBeanの同じキャッシュ済インスタンスによって満たされます。Bean管理の永続性を備えたエンティティBeanは読取り専用であるため、両方のトランザクションをパラレルで処理できます。
この最適化を行わない場合、各クライアントには別々のインスタンスが割り当てられ、各インスタンスはすべてのライフ・サイクル・メソッドの実行を必要とします。
例15-4に、Bean管理の永続性を備えたエンティティBeanを読取り専用として指定するように構成されたorion-ejb-jar.xml
ファイルのentity-deployment
要素のlocking-mode
属性のmode
を示します。
<entity-deployment name=EmployeeBean" location="bmpapp/EmployeeBean" locking-mode="read-only" > ... </entity-deployment>
Bean管理の永続性を備えたエンティティBeanでは、コミット・オプションAとCのどちらかを選択できます。
コミット・オプションAでは、ejbLoad
へのコールを延期することでパフォーマンスが向上します。
Bean管理の永続性を備えた読取り専用エンティティBeanでコミット・オプションAを使用するよう構成する場合(「Bean管理の永続性を備えた読取り専用エンティティBeanの構成」を参照)、Bean管理の永続性を備えた読取り専用エンティティBeanのキャッシングを利用することでパフォーマンスをさらに向上させることができます(「コミット・オプションおよびBMPアプリケーション」を参照)。
コミット・オプションCがデフォルトです。
詳細は、「エンティティBeanのコミット・オプション」を参照してください。
例15-5に、orion-ejb-jar.xml
ファイルのentity-deployment
要素のcommit-option
サブ要素の属性mode
を示します。有効な設定は、A
およびC
です。number-of-buckets
属性は、許可されるキャッシュ・インスタンスの最大数であり、コミット・オプションA
にのみ適用できます。
<entity-deployment name=EmployeeBean" location="bmpapp/EmployeeBean" > <resource-ref-mapping name="jdbc/OracleDS" /> <commit-option mode="A" number-of-buckets="10" /> </entity-deployment>
Bean管理の永続性を備えたエンティティBeanのejbFindByPrimaryKey
メソッドを実装する必要があります(「Bean管理の永続性を備えたEJB 2.1エンティティBeanのejbFindByPrimaryKeyメソッドの実装」を参照)。オプションで、他のfinderを構成できます(「Bean管理の永続性を備えたEJB 2.1エンティティBeanの他のfinderメソッドの実装」を参照)。
詳細は、第16章「EJB 2.1問合せの実装」を参照してください。
ejbFindByPrimaryKey
実装は、Bean管理の永続性を備えたすべてのエンティティBeanに必要です。主な用途は、主キーが有効なBeanに対応しているかを確認することです。妥当性が検証されると、主キーをコンテナに返し、コンテナはそのキーを使用してBean参照をユーザーに返します。
このサンプルでは、従業員番号が有効であることを検証し、主キー(従業員番号)をコンテナに返します。主キーがクラスの場合、より複雑な検証が必要になります。
public EmployeePK ejbFindByPrimaryKey(EmployeePK pk)
throws FinderException {
if (pk == null || pk.empNo == null) {
throw new FinderException("Primary key cannot be null");
}
try {
conn = getConnection(dsName);
ps = conn.prepareStatement(findByPKStatement);
ps.setInt(1, pk.empNo.intValue());
ps.executeQuery();
ResultSet rs = ps.getResultSet();
if (rs.next()) {
pk.empNo = new Integer(rs.getInt(1));
pk.empName = new String(rs.getString(2));
pk.salary = new Float(rs.getFloat(3));
}
else {
throw new FinderException("Failed to select this PK");
}
}
catch (SQLException e) {
throw new FinderException(e.getMessage());
}
catch (NamingException e) {
System.out.println("Caught an exception 1 " + e.getMessage() );
throw new EJBException(e.getMessage());
}
finally {
try {
ps.close();
conn.close();
}
catch (SQLException e) {
throw new EJBException(e.getMessage());
}
}
return pk;
}
オプションで、1つのejbFindByPrimaryKey
メソッド以外にも、他のfinderメソッドを作成できます。
他のfinderメソッドを作成するには、次のようにします。
finderメソッドでは、WHERE
句に従って、1つ以上のBeanを取得できます。複数のBeanを返す場合、Beanのfinderメソッドは、主キーのCollection
を返す必要があります。これらのfinderメソッドは、ユーザーに返す必要のあるすべてのエンティティBeanの主キーのみ収集する必要があります。コンテナは、Collection
内に存在する各エンティティBeanへの参照(複数の参照が返された場合)、または単一のクラス型への参照へ、主キーをマッピングします。
次の例では、すべての従業員のレコードを返すfinderメソッドの実装を示します。
public Collection ejbFindAll() throws FinderException { ArrayList recs = new ArrayList(); ps = conn.prepareStatement("SELECT EMPNO FROM EMPLOYEEBEAN"); ps.executeQuery(); ResultSet rs = ps.getResultSet(); int i = 0; while (rs.next()) { retEmpNo = new Integer(rs.getInt(1)); recs.add(retEmpNo); } ps.close(); return recs; }
次に、javax.ejb.EntityBean
インタフェースでの指定に従って、Bean管理の永続性を備えたエンティティBeanが実装する必要のあるEJB 2.1ライフ・サイクル・メソッドを示します(「Javaの使用方法」を参照)。
Bean管理の永続性を備えたエンティティBeanの場合は、すべてのライフ・サイクル・メソッドの完全な実装をユーザーが提供します。
詳細は、「Bean管理の永続性を備えたEJB 2.1エンティティBeanのライフ・サイクル」を参照してください。
例15-6では、EJB 2.1エンティティBeanのライフ・サイクル・コールバック・メソッドの実装方法を説明します。
public void ejbActivate() {
// when bean is activated
}
|
![]() Copyright © 2002, 2008 Oracle Corporation. All Rights Reserved. |
|