CMP 2.0 には、パーシスタンスの機能の大部分を EJB コンテナに移す高度なパーシスタンスモデルが用意されています。パーシスタンスモデルには、コードへの影響を最小限に抑えながら実際のデータの複雑さを EJB が反映できるようにする、リレーションシップの宣言仕様が含まれています。
エンティティ bean の開発者は、EJB クエリ言語 (EJB-QL) を用いて ejb-jar.xml ファイルの基本的なパーシスタンス情報を指定するだけで、後は CMP 2.0 を使用してビジネスロジックに集中することができます。さらに、エンタープライズデプロイウィザードのようなツールによって、デプロイメントディスクリプタの作成および管理を簡単に行うことができます。
このトピックでは、基本的な CMP 2.0 の例と JRun 特有の CMP 2.0 の使用方法および機能について説明します。CMP 2.0、EJB-QL、およびその他の EJB 2.0 機能の詳細については、EJB 2.0 を解説している業界誌を参照してください。このマニュアルの序章にはこれらの本のリストが記載されています。
ヒント: エンタープライズデプロイウィザードを使用すると、パーシスタンスロジックを生成できます。詳細については、 「エンタープライズデプロイウィザード」 を参照してください。
エンティティ bean のホームインターフェイスには、任意の数の引数を持つ create
メソッドが含まれている場合と含まれていない場合があります。各 create
メソッドには、bean 実装の引数と同じ引数を持つ、一致する ejbCreate
メソッドが 1 つ必要です。エンティティ bean には、少なくとも findByPrimaryKey
のfinder メソッドが含まれている必要があります。これは、bean 実装の ejbFindByPrimaryKey
メソッドに対応しています。リモートホームインターフェイスメソッドは RemoteException
を投げる必要があり、またすべての create
メソッドは CreateException
を投げる必要があります。
次のコードは、EJB 2.0 CMP エンティティ bean のリモートホームインターフェイスを示しています。
package samples.cmp20;
import javax.ejb.EJBHome; import java.rmi.RemoteException; import java.util.Collection; import javax.ejb.CreateException; import javax.ejb.FinderException; public interface EmployeeHome extends EJBHome { public Employee create(String employeeId, String firstName, String lastName, String phone) throws RemoteException, CreateException; public Employee findByPrimaryKey(String employeeId) throws FinderException, RemoteException; public Collection findAll() throws FinderException, RemoteException; public Collection findByLastName(String lastName) throws FinderException, emoteException; }
次のコードは、2.0 CMP エンティティ bean のリモートコンポーネントインターフェイスを示しています。
package samples.cmp20;
import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Employee extends EJBObject { public String getEmployeeId(); public void setEmployeeId(String userId); public String getFirstName(); public void setFirstName(String firstName); public String getLastName(); public void setLastName(String lastName); public String getPhone(); public void setPhone(String phone); }
EJB 2.0 CMP エンティティ bean の一般的な必要条件は次のとおりです。
javax.ejb.EntityBean
を実装する必要があります。
エンティティ bean の bean 実装には、setEntityContext
、必要なコールバックメソッドおよびビジネスメソッドが含まれます。
次のコードは、CMP 2.0 エンティティ bean のリモートの bean 実装を示しています。
package samples.cmp20;
import javax.ejb.EntityBean; import javax.ejb.EntityContext; import javax.ejb.EJBException; import javax.ejb.CreateException; import java.rmi.RemoteException; import javax.ejb.FinderException; public abstract class EmployeeBean implements EntityBean { private EntityContext context; public void ejbLoad() throws RemoteException { } public void ejbStore() throws RemoteException { } public void setEntityContext(EntityContext context) throws RemoteException { this.context = context; } public void unsetEntityContext() throws RemoteException, EJBException { this.context = null; } public void ejbRemove() throws RemoteException { } public void ejbActivate() throws RemoteException { } public void ejbPassivate() throws RemoteException { public String ejbCreate(String employeeId, String firstName, String lastName, String phone) throws RemoteException, CreateException { setEmployeeId(employeeId); setFirstName(firstName); setLastName(lastName); setPhone(phone); return null; } public void ejbPostCreate(String employeeId, String firstName, String lastName, String phone) { } // CMP フィールドのメソッドです。abstract である必要があります。 public abstract String getEmployeeId(); public abstract void setEmployeeId(String userId); public abstract String getFirstName(); public abstract void setFirstName(String firstName); public abstract String getLastName(); public abstract void setLastName(String lastName); public abstract String getPhone(); public abstract void setPhone(String phone); }
CMP 2.0 エンティティ bean のデプロイメントディスクリプタには、entity
要素内に要素が含まれます。また、EJB-QL を使用して、デフォルト以外のすべてのメソッドに対して query
要素を定義します。
次の例は、CMP 2.0 エンティティセッション bean のデプロイメントディスクリプタ内の基本要素を示したものであり、findAll
と findByLastName
メソッドの query
要素が含まれています。
...
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ ejb-jar_2_0.dtd"> <ejb-jar> <enterprise-beans> <entity> <ejb-name>Employee</ejb-name> <ejb-class>samples.cmp20.EmployeeBean</ejb-class> <home>samples.cmp20.EmployeeHome</home> <remote>samples.cmp20.Employee</remote> <persistence-type>Container</persistence-type> <prim-key-class>java.lang.String</prim-key-class> <reentrant>True</reentrant> <primkey-field>employeeId</primkey-field> <abstract-schema-name>employeeschema</abstract-schema-name> <cmp-version>2.x</cmp-version> <cmp-field> <field-name>employeeId</field-name> </cmp-field> <cmp-field> <field-name>firstName</field-name> </cmp-field> <cmp-field> <field-name>lastName</field-name> </cmp-field> <cmp-field> <field-name>phone</field-name> </cmp-field> <query> <query-method > <method-name>findAll</method-name> <method-params /> </query-method> <return-type-mapping>Local</return-type-mapping> <ejb-ql>SELECT OBJECT(o) FROM employeeschema AS o</ejb-ql> </query> <query> <query-method > <method-name>findByLastName</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <return-type-mapping>Local</return-type-mapping> <ejb-ql>SELECT OBJECT(o) FROM employeeschema AS o WHERE o.lastName = ?1</ejb-ql> </query> </entity> </enterprise-beans> </ejb-jar> ...
jrun-ejb-jar.xml ファイルには、JNDI 名やデータソースなど、JRun 特有のデプロイ設定が含まれます。
次のサンプルは、EJB 2.0 CMP エンティティ bean の JRun EJB デプロイメントディスクリプタを示しています。
...
<jrun-ejb-jar> <source>compass</source> <enterprise-beans> <entity> <ejb-name>Employee</ejb-name> <jndi-name>Employee</jndi-name> </entity> </enterprise-beans> ...
サンプルクライアントを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。
このセクションでは、次のように JRun 4 EJB コンテナ特有の開発とデプロイの検討事項を説明します。
JRun EJB コンテナは、デプロイメントディスクリプタによって暗黙に指定されるデータベーステーブルを自動的に生成します。JRun は、各 CMP 2.0 bean に対してabstract-schema-name
要素と同じ名前のテーブルを生成します。また、サポートテーブルも自動的に生成します。これにより、JRun は開発者の対話を最小限にとどめて CMP 2.0 エンティティ beans をデプロイでき、また、EJB の移植性も保証されます。
現在 JRun CMP 2.0 実装では、既存のテーブルとの統合は行われません。既存のデータにアクセスできるエンティティ bean を作成するには、 「CMP エンティティ bean (1.1 仕様)」 で説明した CMP 1.1 を使用します。
CMP 2.0 の場合、JRun EJB コンテナは次のデータソースを使用します。
source
要素が ejb-jar.xml ファイルに指定されていない場合、JRun は ejb-jar.xml ファイルにあるすべてのエンティティ bean をデフォルトのデータソースを使用してデプロイします。デフォルトのデータソースは、JRun サーバの起動時にバインドされる最初のデータソースです。
別々の ejb-jar.xml ファイルで定義された 2 つの異なる CMP 2.0 EJB には同一の abstract-schema-name
が存在できるので、JRun で個別のテーブルが生成されるように、ejb-jar.xml ファイルごとにデータソースを定義する必要があります。
メモ: テーブル名の重複を最小限に抑えるには、ターゲットのデータソースに、ejb-jar.xml ファイルの abstract-schema-name 要素と同じ名前のテーブルが存在しないようにします。
SQL Server データソースと JRun のデータベースドライバを使用する場合は、次の
jrun-resources.xml ファイルの例に示すように、JRun のデータソース URL にSelectMethod=cursor
を追加します。
<url>jdbc:macromedia:sqlserver:// host:1433;databasename=JRun;SelectMethod=cursor </url>
次の表で、JRun EJB コンテナが CMP 2.0 エンティティ bean 用に生成するテーブルを説明します。
開発サイクルの過程で、JRun CMP 2.0 のデータベーステーブルおよびデータのクリーンアップが必要になることがあります。生成したすべてのテーブルとデータをクリアするには、次のユーティリティを使用します。
java -classpath classpath jrunx.persistence.greylock.InitDatabase driver url userパス
クラスパスには、<JRun のルートディレクトリ>/lib/jrun.jar と、指定したデータベースドライバのクライアントクラスのための JAR ファイルが含まれている必要があります。
次の例は、サンプルのデータベースのテーブルをクリーンアップします。
java -classpath c:/jrun4b3/lib/jrun.jar;c:/jrun4b3/pointbase/lib/ pbclient42re.jar jrunx.persistence.greylock.InitDatabase com.pointbase.jdbc.jdbcUniversalDriver jdbc:pointbase:server://127.0.0.1:9192/samples PBPUBLIC PBPUBLIC
JRun CMP 2.0 の詳細については、次のリソースを参照してください。
このマニュアルのリソースおよび例を使用するだけでなく、EJB 2.0 に関する業界誌も参照してください。このマニュアルの序章にはこれらの本のリストが記載されています。