EJB 2.0 では、アプリケーションサーバが EJB 2.0 スタイルの CMP だけではなく、EJB 1.1 スタイルの CMP もサポートする必要があります。JRun EJB 1.1 CMP を使用する場合は、jrun-ejb-jar.xml ファイルでパーシスタンスロジックを指定します。
ヒント: エンタープライズデプロイウィザードを使用すると、パーシスタンスロジックを生成できます。詳細については、 「エンタープライズデプロイウィザード」 を参照してください。
エンティティ bean のホームインターフェイスには、任意の数の引数を持つ create
メソッドが含まれている場合と含まれていない場合があります。各 create
メソッドには、bean 実装の同じ引数に一致する ejbCreate
メソッドが 1 つ必要です。エンティティ bean には、少なくとも findByPrimaryKey
のfinder メソッドが含まれている必要があります。これは、bean 実装の ejbFindByPrimaryKey
メソッドに対応しています。リモートホームインターフェイスメソッドは RemoteException
を投げる必要があり、またすべての create
メソッドは CreateException
を投げる必要があります。
次のコードは、CMP 1.1 エンティティ bean のリモートホームインターフェイスを示しています。
package samples.cmp11;
import javax.ejb.FinderException; import java.util.Collection; import java.rmi.RemoteException; public interface EmployeeHome extends javax.ejb.EJBHome { public Employee create(java.lang.String employeeId, java.lang.String firstName, java.lang.String lastName, java.lang.String phone) throws java.rmi.RemoteException, javax.ejb.CreateException; public Employee findByPrimaryKey(java.lang.String pk) throws java.rmi.RemoteException, javax.ejb.FinderException; public Collection findAll() throws java.rmi.RemoteException, javax.ejb.FinderException; public Collection findByLastName(String lastName) throws java.rmi.RemoteException, javax.ejb.FinderException; }
次のコードは、CMP 1.1 エンティティ bean のリモートコンポーネントインターフェイスを示しています。
package samples.cmp11;
import javax.ejb.EJBObject; import java.rmi.RemoteException; public interface Employee extends EJBObject { public String getEmployeeId() throws RemoteException; public void setEmployeeId(String employeeId) throws RemoteException; public String getFirstName() throws RemoteException; public void setFirstName(String firstName) throws RemoteException; public String getLastName() throws RemoteException; public void setLastName(String lastName) throws RemoteException; public String getPhone() throws RemoteException; public void setPhone(String phone) throws RemoteException; }
CMP 1.1 エンティティ bean の一般的な必要条件は次のとおりです。
javax.ejb.EntityBean
を実装する必要があります。
エンティティ bean の bean 実装には、setEntityContext
、必要なコールバックメソッドおよびビジネスメソッドが含まれます。
次のコードは、CMP 1.1 エンティティ bean のリモートの bean 実装を示しています。
package samples.cmp11;
import javax.ejb.EntityContext; import javax.ejb.RemoveException; import javax.ejb.FinderException; import java.util.Collection; import java.rmi.RemoteException; public class EmployeeBean implements javax.ejb.EntityBean { private EntityContext context; // フィールドは、データベースの列に対応しています。 public String employeeId; public String firstName; public String lastName; public String phone; public String ejbCreate(String employeeId, String firstName, String lastName, String phone) { this.employeeId = employeeId; this.firstName = firstName; this.lastName = lastName; this.phone = phone; return null; } public void ejbPostCreate(String employeeId, String firstName, String lastName, String phone) { } public String getEmployeeId() { return employeeId; } public void setEmployeeId(String employeeId) { this.employeeId = employeeId; } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public void setEntityContext(EntityContext context) { this.context = context; } public void unsetEntityContext() { this.context = null; } // CMP は、これらのコールバックメソッドを自動処理します。 public void ejbActivate() { } public void ejbPassivate() { } public void ejbLoad() { } public void ejbStore() { } public void ejbRemove() throws RemoveException { } }
CMP 1.1 エンティティ bean のデプロイメントディスクリプタには、entity
要素内に要素が含まれます。jrun-ejb-jar.xml ファイルのパーシスタンスアクションを指定する必要もあります。また、アプリケーションアセンブル担当者は、assembly-descriptor
要素内に追加仕様を作成できます。
次のサンプルは、CMP 1.1 エンティティ bean のデプロイメントディスクリプタ内の基本要素を示しています。
...
<entity> <ejb-name>Employee</ejb-name> <ejb-class>samples.cmp11.EmployeeBean</ejb-class> <home>samples.cmp11.EmployeeHome</home> <remote>samples.cmp11.Employee</remote> <persistence-type>Container</persistence-type> <primkey-field>employeeId</primkey-field> <prim-key-class>java.lang.String</prim-key-class> <reentrant>True</reentrant> <cmp-version>1.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> </entity> ...
jrun-ejb-jar.xml ファイルには、CMP パーシスタンスのアクションなど、JRun 特有のデプロイ設定が含まれます。各アクション (作成、ロード、保管など) は、必要に応じてデータベースにアクセスする SQL ステートメントに対応します。次のようにデータソースを指定します。
source
要素でパーシスタンスアクション用に指定されたデータソースを検索します。
source
要素を使用します。次のサンプルは、EJB 1.1 CMP エンティティ bean の JRun EJB デプロイメントディスクリプタを示しています。
...
<entity> <ejb-name>Employee</ejb-name> <jndi-name>Employee</jndi-name> <jdbc-mappings> <jdbc-mapping> <name>create</name> <statement> <action>INSERT INTO employees (employee_id , first_name , last_name, phone) VALUES ( ?, ? , ? , ?)</action> <source>samples</source> <params> <param> <name>employeeId</name> <type>VARCHAR</type> </param> <param> <name>firstName</name> <type>VARCHAR</type> </param> <param> <name>lastName</name> <type>VARCHAR</type> </param> <param> <name>phone</name> <type>VARCHAR</type> </param> </params> </statement> </jdbc-mapping> <jdbc-mapping> <name>load</name> <statement> <action>SELECT employee_id, first_name, last_name, phone FROM employees WHERE employee_id=?</action> <source>samples</source> <params> <param> <name>employeeId</name> <type>VARCHAR</type> </param> </params> <fields> <field>employeeId</field> <field>firstName</field> <field>lastName</field> <field>phone</field> </fields> </statement> </jdbc-mapping> <jdbc-mapping> <name>remove</name> <statement> <action>DELETE FROM employees WHERE employee_id=?</action> <source>samples</source> <params> <param> <name>employeeId</name> <type>VARCHAR</type> </param> </params> </statement> </jdbc-mapping> <jdbc-mapping> <name>store</name> <statement> <action>UPDATE employees SET first_name=?, last_name=?, phone=?WHERE employee_id=?</action> <source>samples</source> <params> <param> <name>firstName</name> <type>VARCHAR</type> </param> <param> <name>lastName</name> <type>VARCHAR</type> </param> <param> <name>phone</name> <type>VARCHAR</type> </param> <param> <name>employeeId</name> <type>VARCHAR</type> </param> </params> </statement> </jdbc-mapping> <jdbc-mapping> <name>findAll</name> <statement> <action>SELECT employee_id FROM employees</action> <source>samples</source> <fields> <field>employeeId</field> </fields> </statement> </jdbc-mapping> <jdbc-mapping> <name>findByLastName</name> <statement> <action>SELECT employee_id FROM employees WHERE last_name=?1</action> <source>samples</source> <params> <param> <name>lastName</name> <type>VARCHAR</type> </param> </params> <fields> <field>employeeId</field> </fields> </statement> </jdbc-mapping> <jdbc-mapping> <name>findByPrimaryKey</name> <statement> <action>SELECT employee_id FROM employees WHERE employee_id=?</action> <source>samples</source> <params> <param> <name>employeeId</name> <type>VARCHAR</type> </param> </params> <fields> <field>employeeId</field> </fields> </statement> </jdbc-mapping> </jdbc-mappings> </entity> ...
サンプルクライアントを表示するには、samples JRun サーバを起動し、ブラウザで http://localhost:8200/techniques を開きます。
JRun EJB コンテナは、次の機能によって CMP 1.1 開発の負担を軽減します。
jrun-ejb-jar.xml ファイルで create-table
要素が true に設定されている場合、JRun は、createTable
jdbc-mapping
要素で指定されたとおりにテーブル作成 DDL (Data Definition Language:データ定義言語) を実行します。また、JRun は delete-table
要素と deleteTable
jdbc-mapping
要素を使用して、テーブル削除ロジックを実行します。この機能は、常に正式なデータベーステーブルのコピーを使用してテストを開始できるので、開発サイクルの段階で役立ちます。次の jrun-ejb-jar.xml の抜粋は、テーブルの自動作成と自動削除のステートメントを示しています。
...
<create-table>true</create-table> <delete-table>true</delete-table> ... <jdbc-mapping> <name>createTable</name> <statement> <action>CREATE TABLE public.EntityTestBeanTable (id INTEGER, value VARCHAR(32))</action> <source>samples</source> <params /> <fields /> </statement> </jdbc-mapping> <jdbc-mapping> <name>deleteTable</name> <statement> <action>DROP TABLE public.EntityTestBeanTable</action> <source>samples</source> <params /> <fields /> </statement> </jdbc-mapping> ...
create-table
要素が true に設定されていて、createTable
jdbc-mapping
要素がファイルにない場合、JRun は「"SQL の自動生成" 」で説明するようにデフォルトの DDL を生成します。
基本的なメソッドステートメント (create
、load
、store
、remove
、findByPrimaryKey
、createTable
、および deleteTable
) のいずれかに jrun-ejb-jar.xml ファイルのjdbc-mapping
が含まれていない場合、JRun は、ejb-jar.xml ファイルで指定されている EJB 名と CMP フィールドに基づいて、デフォルトの SQL 実装を作成します。この機能を使用するには、EJB 名がデータベースのテーブル名に一致し、cmp-field
要素がそのデータベーステーブルの列名に一致している必要があります。
メモ: テーブルを作成および削除する場合、EJB コンテナは、create-table および
delete-table 要素が true に設定されている場合にのみ SQL を生成します。
JRun では、各 jdbc-mapping
要素に対して複数の statement
要素を指定できます。この機能を使用して、各パーシスタンスアクションによる複数のデータベースへのアクセスなど、カスタマイズしたパーシスタンス処理を実行できます。EJB コンテナは、jdbc-mapping
要素に定義された順序でステートメントを実行します。
次の例は、jdbc-mapping 要素に関連付けられた statement 要素のコーディング方法を示しています。
...
<jdbc-mapping> <name>create</name> <statement> <action>INSERT INTO employee( empid , lastname, firstname) VALUES( ?, ? , ? , ? , ?)</action> <source>samples</source> <params> <param> <name>empid</name>> <type>VARCHAR</type> </param> <param> <name>lastname</name> <type>VARCHAR</type> </param> <param> <name>firstname</name> <type>VARCHAR</type> </param> </params> <fields /> </statement> <statement> ... </statement> </jdbc-mapping> ...