CMP エンティティ bean (2.0 仕様)

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);
}

bean 実装

EJB 2.0 CMP エンティティ bean の一般的な必要条件は次のとおりです。

エンティティ 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);
}

EJB デプロイメントディスクリプタ

CMP 2.0 エンティティ bean のデプロイメントディスクリプタには、entity 要素内に要素が含まれます。また、EJB-QL を使用して、デフォルト以外のすべてのメソッドに対して query 要素を定義します。

次の例は、CMP 2.0 エンティティセッション bean のデプロイメントディスクリプタ内の基本要素を示したものであり、findAllfindByLastName メソッドの 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 デプロイメントディスクリプタ

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 CMP 2.0 の追加検討事項

このセクションでは、次のように 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 コンテナは次のデータソースを使用します。

別々の ejb-jar.xml ファイルで定義された 2 つの異なる CMP 2.0 EJB には同一の abstract-schema-name が存在できるので、JRun で個別のテーブルが生成されるように、ejb-jar.xml ファイルごとにデータソースを定義する必要があります。

メモ:  テーブル名の重複を最小限に抑えるには、ターゲットのデータソースに、ejb-jar.xml ファイルの abstract-schema-name 要素と同じ名前のテーブルが存在しないようにします。

SQL Server と JRun JDBC ドライバの併用

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 用に生成するテーブルを説明します。
説明
abstract-schema-name
JRun は、ejb-jar.xml ファイルに各 abstract-schema-name 要素のテーブルを生成します。このテーブルには、cmp-field 要素に対応する列、および JRun 内部でインスタンスとの関連付けに使用される列 (abstract-schema-name$JRunID) があります。
abstract-schema-name_view
データ取り出しの最適化に使用します。
jrun_id
内部 ID の生成に使用します。
jrun_insts
生成されたすべてのインスタンスのタイプとインスタンス ID が含まれます。
jrun_props
cmp-field プロパティのメタデータが含まれます。
jrun_types
デプロイされた各 CMP 2.0 エンティティ bean のエントリが 1 つずつ含まれます。

開発サイクルの過程で、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 に関する業界誌も参照してください。このマニュアルの序章にはこれらの本のリストが記載されています。