前へ     目次     索引     DocHome     次へ     
iPlanet Application Server 開発者ガイド



第 6 章   エンティティ EJB のビルド


この章では、エンティティ EJB とエンティティ Beans の構成について説明します。また、アプリケーションでエンティティ Beans を作成したり、エンティティ Beans のニーズを決定する際に役立つ付加的なガイドラインも提供されます。

この章には次の節があります。

この仕様書は install_dir/ias/docs/index.htm からアクセス可能です。install_dir は、iPlanet Application Server がインストールされている場所です。



エンティティ EJB の紹介



分散マルチユーザアプリケーションの中心部は、データベースや既存のレガシーアプリケーションなどのトランザクションのデータソースとも頻繁に対話します。ほとんどの場合、外部データソースあるいはビジネスオブジェクトはユーザにとって透過的か、またはダイレクトユーザ対話から隠されているか保護されています。これらの保護されたパーシスタントなトランザクション対話 (データベース、ドキュメント、およびほかのビジネスオブジェクトとの対話) はエンティティ EJB へのカプセル化に適しています。

EJB は、データメンバー、プロパティ、およびメソッドを持つ自己完結型の再利用可能なコンポーネントです。これらは、クライアント間での共有が可能な、トランザクション認識型のパーシスタントデータオブジェクトの一般的なインスタンスを表します。パーシスタンスとは、アプリケーションの生存期間を通じた Bean の作成と維持のことです。

パーシスタンス管理には次の 2 種類があり、iPlanet Application Server ではその両方をサポートしています。

  • コンテナ管理パーシスタンス - コンテナが、Bean のパーシスタンスに対して責任を負う

  • Bean 管理パーシスタンス - Bean が、Bean 自体のパーシスタンスに対して責任を負う

ユーザは開発者として、JDBC と SQL を介してデータベースアクセス呼び出しを Bean クラスのメソッドに直接提供することによって、Bean 管理エンティティ Beans をコード化します。データベースアクセス呼び出しは、ejbCreate()ejbRemove()ejbFindXXX()ejbLoad()、およびejbStore() メソッドに存在する必要があります。Bean 管理パーシスタンスを使う利点は、コンテナがデータベースを呼び出さなくても、コンテナに Bean を入れることができる点にあります。

エンティティ Beans は、コンテナが管理するエンティティオブジェクトのセキュリティ、同時性、トランザクション、およびほかのコンテナ固有のサービスを管理するようにコンテナに要求します。複数のクライアントによるエンティティオブジェクトへの同時アクセスが可能で、コンテナは、トランザクションを介した同時アクセスを透過的に処理します。

アプリケーション開発者として、コンテナのエンティティ Beans サービスに直接アクセスすることはできず、その必要性もありません。コンテナは低レベルの実装詳細を管理するために存在するので、開発者は、アプリケーション全体でエンティティ Beans が果たす、より重要な役割の管理に専念できます。

クライアントは、Bean のリモートインタフェースを介してエンティティ Beans にアクセスします。リモートインタフェースを実装するオブジェクトを EJB オブジェクトと呼びます。通常、エンティティ EJB は複数のクライアントに共有され、データベースなどのデータリソースやビジネスオブジェクトに 1 つのエントリポイントを示します。指定された時間にどのクライアントがエンティティオブジェクトにアクセスするのかにかかわらず、各クライアントのオブジェクトのビューは場所に関係なく、ほかのクライアントに対して透過的です。

さらに、コンテナに組み込まれるエンティティ Beans の数に制限はありません。コンテナは各エンティティ Beans のホームインタフェースを実装します。ホームインタフェースによって、クライアントはエンティティオブジェクトの作成、検索、および削除ができます。クライアントは、Java Naming and Directory Interface (JNDI) を介してエンティティ Beans のホームインタフェースを検索します。

エンティティ Beans には次の属性があります。

  • データベースのデータを表示する

  • トランザクションをサポートする

  • 複数のクライアントを対象に実行する

  • すべてのクライアントにとって不要になるまで持続する

  • サーバクラッシュを透過的に回避する

一般に、エンティティ Beans はデータベースの共有データを表し、トランザクション認識型です。通常、Bean のコンテナによって管理されるトランザクションのコンテキスト内で動作します。


エンティティ Beans へのアクセス

ブラウザや Servlet などのクライアントは、Bean のリモートインタフェースである EJBObject を介してエンティティ Beans にアクセスします。EJB オブジェクトは、リモートオブジェクト呼び出しの標準 Java API を介してクライアントからアクセスできる、リモート Java プログラミング言語オブジェクトです。EJB は作成されてから破棄されるまでコンテナ内に存在し、コンテナは EJB のライフサイクルとサポートサービスを管理します。

クライアントがエンティティ Beans のインスタンスに直接アクセスすることはありません。そうではなく、クライアントはエンティティ Beans のリモートインタフェースを使って Bean インスタンスにアクセスします。エンティティ Beans のリモートインタフェースを実装した EJB オブジェクトクラスは、コンテナによって提供されます。EJB オブジェクトは少なくとも、java.ejb.EJBObject インタフェースのすべてのメソッドをサポートします。これらのメソッドには、エンティティ Beans のホームインタフェースの取得、オブジェクトハンドルの取得、エンティティのプライマリキーの取得、そのオブジェクトがほかのオブジェクトと重複していないかどうかを調べるテスト、およびオブジェクトの削除などがあります。これらのメソッドは EJB 仕様書に明記されています。さらに、多くの EJB オブジェクトのリモートインタフェースは、特定のビジネスロジックメソッドもサポートしています。これらのメソッドがアプリケーションの中枢です。

この仕様書は install_dir/ias/docs/index.htm からアクセス可能です。install_dir は、iPlanet Application Server がインストールされている場所です。



エンティティ Beans のコンポーネント



エンティティ Beans を作成するには、次のクラスファイルを準備する必要があります。

  • Enterprise JavaBeans クラス

  • javax.ejb.EJBHome を実装する Enterprise JavaBeans ホームインタフェース

  • javax.ejb.EJBObject を実装する Enterprise JavaBeans リモートインタフェース


クラス定義の作成

エンティティ Beans の Bean クラスは、abstract ではなく public として定義する必要があります。Bean クラスは、javax.ejb.EntityBean インタフェースを実装する必要があります。次のようにします。

import java.rmi.*;
import java.util.*;
import javax.ejb.*;
public class MyEntityBean implements EntityBean {
// エンティティ Beans の実装。これらのメソッドは常に取り込む必要があります。
public void ejbActivate() throws RemoteException {
}
public void ejbLoad() throws RemoteException {
}
public void ejbPassivate() throws RemoteException {
}
public void ejbRemove() throws RemoteException{
}
public void ejbStore() throws RemoteException{
}
public void setEntityContext(EntityContext ctx) throws RemoteException {
}
public void unsetEntityContext() throws RemoteException {
}
// 他のコードは省略します。
}

これらのメソッドに加えて、エンティティ Beans のクラスは 1 つまたは複数の ejbCreate() メソッドと ejbFindByPrimaryKey() ファインダーメソッドを定義する必要があります。オプションで、各 ejbCreate() メソッドに ejbPostCreate() メソッドを定義できます。また、ejbFindXXX 形式の開発者定義ファインダーメソッドを追加することもあります。ここで、XXX はほかのメソッド名と重複しない連続した固有のメソッド名を示します (例 :ejbFindApplesAndOranges)。

さらに、多くの有効なエンティティ Beans は、1 つまたは複数のビジネスメソッドを実装します。これらのメソッドは通常、各 Bean に対して固有であり、その特定の機能を表します。任意のビジネスメソッド名を付けることができますが、この EJB アーキテクチャで使われるメソッド名と重複しないように注意してください。ビジネスメソッドは、public として宣言する必要があります。メソッド引数および戻り値は Java RMI の正しいタイプである必要があります。throws 句は、アプリケーション固有の例外を定義し、java.rmi.RemoteException を含めることもできます。

エンティティ Beans を実装するには、次の 2 つのタイプのビジネスメソッド使用します。

  • 内部ビジネスメソッドは、Bean 内のほかのビジネスメソッドに使われます。Bean の外部からアクセスされることはありません。

  • 外部ビジネスメソッドは、エンティティ Beans のリモートインタフェースによって参照されます。

次の節では、エンティティ Beans のクラス定義のさまざまなメソッドについて説明します。

これらの節に示す、次のメンバー変数定義があると想定します。

private transient javax.ejb.EntityContext m_ctx = null;

// これらは、我々の Bean のステートを定義します。
private int m_quantity;
private int m_totalSold;


ejbActivate と ejbPassivate の使用法

サーバアプリケーションでエンティティ Beans のインスタンスが必要になると、Bean のコンテナは、ejbActivate() を呼び出して Bean インスタンスを準備します。同様に、アプリケーションでインスタンスが不要になると、Bean のコンテナは、ejbPassivate() を呼び出してアプリケーションから Bean を分離します。

アプリケーション用に初めて Bean を準備するときや Bean が不要になったときに、特定のアプリケーションタスクを実行する必要がある場合は、これらのメソッド内でそのような操作をプログラミングします。

Bean の活性化と作成は異なります。活性化は、すでに作成されている Bean に対して行います。同様に、Bean の不活性化と削除も異なります。不活性化とは、将来の使用に備えてコンテナプールに Bean インスタンスを返すことです。Bean インスタンスを削除するには、ejbRemove() を呼び出します。

コンテナは、指定した (またはデフォルトの) 時間を過ぎてもアクティブにならないエンティティ Beans を不活性化します。このタイムアウト値は、Bean のプロパティファイルで設定されます。詳細については、「EJB XML DTD」を参照してください。

ejbCreate() および ejbRemove() の詳細については、「ejbCreate メソッドの使用法」を参照してください。

ejbActivate() および ejbPassivate() の詳細については、EJB 仕様書を参照してください。この仕様書は install_dir/ias/docs/index.htm からアクセス可能です。install_dir は、iPlanet Application Server がインストールされている場所です。


ejbLoad と ejbStore の使用法

Bean 管理パーシスタンスを使用するエンティティ Beans は、コンテナが同期をとるためにデータベースに Bean のステート情報を格納することを許可します。ejbStore() を実装するとデータベースにステート情報が保存され、ejbLoad() を実装するとデータベースからステート情報が取り出されます。コンテナは、ejbLoad() を呼び出し、データベースからステート情報を読み込むことによって Bean のステートと同期をとります。

エンティティ Beans がコンテナ管理パーシスタンスを使う場合は、データベースアクセスレイヤをコーディングする必要はありません。

次の例は、アクティブデータの格納と取得を行う ejbLoad() および ejbStore() メソッドの定義を示します。

public void ejbLoad()
       throws java.rmi.RemoteException
{
   String itemId;
   DatabaseConnection dc = null;
   java.sql.Statement stmt = null;
   java.sql.ResultSet rs = null;

   itemId = (String) m_ctx.getPrimaryKey();

   System.out.println("myBean:Loading state for item " + itemId);

   String query =
       "SELECT s.totalSold, s.quantity " +
       " FROM Item s " +
       " WHERE s.item_id = " + itemId;

   dc = new DatabaseConnection();
   dc.createConnection(DatabaseConnection.GLOBALTX);
   stmt = dc.createStatement();
   rs = stmt.executeQuery(query);

   if (rs != null) {
       rs.next();
       m_totalSold = rs.getInt(1);
       m_quantity = rs.getInt(2);
   }
}

public void ejbStore()
       throws java.rmi.RemoteException
{
   String itemId;
   itemId = (String) m_ctx.getPrimaryKey();
   DatabaseConnection dc = null;
   java.sql.Statement stmt1 = null;
   java.sql.Statement stmt2 = null;

   System.out.println("myBean:Saving state for item = " + itemId);

   String upd1 =
       "UPDATE Item " +
       " SET quantity = " + m_quantity +
       " WHERE .item_id = " + itemId;

   String upd2 =
       "UPDATE Item " +
       " SET totalSold = " + m_totalSold +
       " WHERE .item_id = " + itemId;

   dc = new DatabaseConnection();
   dc.createConnection(DatabaseConnection.GLOBALTX);
   stmt1 = dc.createStatement();
   stmt1.executeUpdate(upd1);
   stmt1.close();
   stmt2 = dc.createStatement();

   stmt2.executeUpdate(upd2);
   stmt2.close();
}

ほかの Bean と同時にトランザクションにアクセスする Bean の分離レベルの詳細については、「同時アクセスの処理」を参照してください。


setEntityContext と unsetEntityContext の使用法

コンテナは、エンティティ Beans のインスタンスを作成してコンテナに Bean のインタフェースを指定してから setEntityContext() を呼び出します。このメソッドを実装すると、インスタンス変数にコンテナの参照を保存できます。

public void setEntityContext(javax.ejb.EntityContext ctx)
{
m_ctx = ctx;
}

同様に、コンテナは unsetEntityContext() を呼び出して、インスタンスからコンテナ参照を削除します。これは、コンテナによって呼び出される最後の Bean クラスメソッドです。この呼び出しのあと、Java ガベージコレクションメカニズムは最終的にそのインスタンスに対して finalize() を呼び出し、そのインスタンスをクリーンアップして廃棄します。

public void unsetEntityContext()
{
m_ctx = null;
}


ejbCreate メソッドの使用法

エンティティ Beans は、1 つまたは複数の ejbCreate(...) メソッドを実装する必要もあります。クライアントが Bean を呼び出すたびに、必ずこのメソッドを 1 つ使います。次のようにします。

public integer ejbCreate() {
   string[] userinfo = {"User Name", "Encrypted Password"};
}

ejbCreate() メソッドは、public として宣言され、エンティティのプライマリキータイプまたはコレクションのどれかを返し、ejbCreate という名前を付ける必要があります。戻り値のタイプは、正しい Java RMI タイプであれば何であってもかまいません。引数はすべて、正しいタイプの Java RMI である必要があります。throws 句は、アプリケーション固有の例外を定義し、java.rmi.RemoteExceptionjavax.ejb.CreateException を含めることができます。

ejbCreate() メソッドに対して、エンティティ Beans のクラスで作成後すぐにエンティティサービスを処理する ejbPostCreate() メソッドを定義することができます。各 ejbPostCreate() メソッドは public として宣言し、void を返し、ejbPostCreate という名前を付ける必要があります。メソッド引数がある場合は、対応する ejbCreate メソッドの数および引数のタイプと一致させる必要があります。throws 句は、アプリケーション固有の例外を定義し、java.rmi.RemoteExceptionjava.ejb.CreateException を含めることができます。

さらに、エンティティ Beans は 1 つまたは複数の ejbRemove() メソッドを実装し、不要になった Bean を解放します。


ファインダーメソッドの使用法

エンティティ Beans はパーシスタントであり、複数のクライアント間で共有され、一度に複数回インスタンス化される可能性があります。したがって、エンティティ Beans は少なくとも 1 つの ejbFindByPrimaryKey() メソッドを実装する必要があります。このメソッドによって、クライアントおよび Bean のコンテナは特定の Bean インスタンスを探すことができます。すべてのエンティティ Beans には、識別署名として固有のプライマリキーを指定する必要があります。ejbFindByPrimaryKey() メソッドを Bean クラスに実装し、Bean がそのプライマリキーをコンテナに返すことができるようにします。

次の例は、FindByPrimaryKey() の定義を示しています。

public String ejbFindByPrimaryKey(String key)
       throws java.rmi.RemoteException
          javax.ejb.FinderException
{
   //System.out.println("@@@ myBean.ejbFindByPrimaryKey key = " + key);
   return key;
}

特定のエンティティ Beans のインスタンスは、その Bean の動作内容、そのインスタンスが操作する値などの条件に基づいて検索される場合があります。特定の実装に関するこれらのファインダーメソッドの名前は ejbFindXXX の形式です。ここで、XXX は、ほかのメソッド名と重複しない連続した固有のメソッド名を表します (例 :ejbFindApplesAndOranges)。

ファインダーメソッドは public として宣言され、その引数および戻り値は正しいタイプの Java RMI である必要があります。各ファインダーメソッドの戻り値のタイプは、エンティティ Beans のプライマリキータイプか、同じプライマリキータイプのオブジェクトのコレクションである必要があります。戻り値のタイプがコレクションのとき、次のいずれかである必要があります。

  • JDK 1.1 の java.util.Enumeration インタフェース

  • Java 2 の java.util.Collection インタフェース

ファインダーメソッドの throws 句は、アプリケーション特有の例外であり、java.rmi.RemoteExceptionjavax.ejb.FinderException が含まれる場合があります。


リモートインタフェースの宣言と実装

Bean クラス定義には、Bean のリモートインタフェースで定義される各メソッドごとに、一致するメソッド名、引数、および戻り値タイプなどのマッチングメソッド定義が 1 つ以上必要です。EJB 仕様書では、Bean クラスへのリモートインタフェースのメソッドの実装が許可されています。ただし、一方では、仕様書に述べられているクライアント - コンテナ - EJB プロトコルに違反して、クライアントに this を介して直接参照を不用意に渡さないようするため、この方法を使用しないよう勧めています。


ホームインタフェースの作成

ホームインタフェースは、クライアントがアプリケーションにアクセスしてエンティティオブジェクトを作成したり削除したりするメソッドを定義します。ホームインタフェースは通常、javax.ejb.EJBHome を拡張します。次のようにします。

import javax.ejb.*;
import java.rmi.*;

public interface MyEntityBeanHome extends EJBHome {
   MyEntityBean create() throws CreateException, RemoteException;
}

この例では、1 つまたは複数の create メソッドを定義するエンティティ Beans のホームインタフェースについて説明します。ホームインタフェースは通常、Bean クラス内のファインダーメソッドに対応する 1 つまたは複数の find メソッドを定義します。


create メソッドの定義

各メソッドには create という名前を付け、エンティティ Beans クラスで定義された ejbCreate メソッドの数および引数のタイプと一致させる必要があります。ただし、各 create メソッドの戻り値タイプは、対応する ejbCreate メソッドの戻り値タイプとは一致しません。そうではなく、エンティティ Beans のリモートインタフェースタイプを返します。

ejbCreate メソッドの throws 句で定義するすべての例外を、ホームインタフェースで一致している create メソッドの throws 句で定義する必要があります。さらに、ホームインタフェースの throws 句には常に、javax.ejb.CreateException を含める必要があります。


find メソッドの定義

ホームインタフェースは、1 つまたは複数の find メソッドを定義できます。各メソッドには findXXX という名前を付ける必要があります (findApplesAndOrangesなど)。ここで、XXX は連続した固有のメソッド名を表します。各ファインダーメソッドは、エンティティ Beans のクラス定義で定義されたファインダーメソッドの 1 つと一致する必要があります。

その数および引数のタイプも Bean クラスのファインダーメソッド定義と一致する必要があります。しかし、戻り値タイプは異なる場合があります。ホームインタフェースのファインダーメソッドの戻り値のタイプは、エンティティ Beans のリモートインタフェースタイプか、インタフェースのコレクションである必要があります。さらに、ホームインタフェースの throws 句には常に、javax.ejb.FinderException を含める必要があります。

さらに、すべてのホームインタフェースが、不要になった EJB を破棄する 2 つの remove メソッドを自動的に定義します。



これらのメソッドはオーバーライドしないでください。




リモートインタフェースの作成

エンティティ Beans のリモートインタフェースは、Bean のメソッドへのユーザアクセスを定義します。すべてのリモートインタフェースが、javax.ejb.EJBObject を拡張します。次のようにします。

import javax.ejb.*;
import java.rmi.*;
public interface MyEntityBean extends EJBObject {
// ここでビジネスメソッドを定義します。
}

リモートインタフェースは、クライアントが呼び出すエンティティ Beans のビジネスメソッドを定義します。リモートインタフェース内で定義されたビジネスメソッドは、実行時に Bean のコンテナによって実行されます。リモートインタフェースで定義した各メソッドには、Bean クラス内の対応するメソッドを指定する必要があります。Bean クラス内の対応するメソッドには同じシグネチャが必要です。

リモートインタフェースで定義するビジネスメソッド以外に、EJBObject インタフェースはいくつかの抽象的なメソッドを定義します。これらのメソッドを使うと、Bean のホームインタフェースを取得したり、Bean のハンドルを取得できるだけでなく、Bean インスタンスを一意に識別する Bean のプライマリキーを取得したり、重複していないことを確認するためにほかの Bean と比較したり、不要になった Bean を削除したりすることもできます。

これらの組み込みメソッドとその使用法の詳細については、EJB 仕様書を参照してください。この仕様書は install_dir/ias/docs/index.htm からアクセス可能です。install_dir は、iPlanet Application Server がインストールされている場所です。



エンティティ Beans の付加的なガイドライン



エンティティ Beans として表すことができるアプリケーションの各部を決める前に、知っておくべき事項がいくつかあります。これらには、エンティティ Beans の EJB 仕様に関連する事項と、iPlanet Application Server および iPlanet Application Server によるエンティティ Beans のサポートに固有の事項があります。


iPlanet Application Server 機能へのアクセス

開発可能なエンティティ Beans には、EJB 仕様に厳密に準拠しているエンティティ Beans、その仕様と iPlanet Application Server の付加価値機能の両方を活用しているエンティティ Beans、および iPlanet Application Server 以外の環境での仕様に準拠してはいるが利用できる iPlanet Application Server 機能も活用するエンティティ Beans があります。希望の配置シナリオに最適な Bean を選択します。

iPlanet Application Server は、iPlanet Application Server コンテナを介していくつかの機能を提供します。また、iPlanet Application Server の API によって、アプリケーションは特定の iPlanet Application Server 環境での機能をプログラムで利用できます。iPlanet Application Server 環境だけでエンティティ Beans を使う予定であれば、これらの Bean に API 呼び出しを埋め込むことができます。


ハンドルと参照の直列化

Bean 参照の直列化を保証するには、EJB への直接参照ではなくハンドルを使うようにと、EJB 仕様書に記述されています。

iPlanet Application Server の直接参照も直列化が可能です。ただし、すべてのベンダーによってサポートされているわけではないので、この拡張機能を利用できない場合もあります。


トランザクションの管理

多くのエンティティ Beans はデータベースと対話します。Bean のプロパティファイルの設定値を使って、Bean のトランザクションを制御します。これにより、Bean 配置時にトランザクション属性を指定できます。

エンティティ Beans の場合は、コンテナ管理トランザクションが使用できます。

コンテナがトランザクションを管理する場合は、Bean のデータベースアクセスメソッド内で明示してトランザクションを「起動」、「ロールバック」、または「コミット」する必要はありません。

トランザクション管理をコンテナレベルに移すことによって、Bean のアクティビティがデータベースアクセスと直接結び付いていなくても、データベース呼び出しと同じトランザクション制御環境ですべての Bean アクティビティを配置できます。これにより、コンテナによって制御されるアプリケーションのすべての部分が、同じトランザクションの一部として動作しますが、失敗すると、コンテナが管理していたものはすべてコミットされるか、ロールバックされます。実際には、コンテナ管理トランザクションのステートによって、同期ルーチンをプログラミングせずにアプリケーションの同期をとることができます。


トランザクションのコミット

コミットが発生し、エンティティ Beans の有効な作業が終了したことがコンテナに伝わると、コンテナは、基礎となっているデータソースとステートの同期をとります。コンテナはトランザクションの終了を許可し、将来の使用に備えて Bean をプールに返します。コミットされたトランザクションに関連付けられたリザルトセットは無効になります。同じ Bean に対する連続したリクエストによって、基礎となっているデータソースとステートの同期をとる際にコンテナの負荷が発生します。

コンテナで開始されたトランザクションが暗黙的にコミットされることに注意してください。また、トランザクションに関連した Bean であれば、トランザクションをロールバックできます。トランザクションの詳細については、第 8 章「EJB のトランザクション処理」を参照してください。


コミットオプション C

コミットオプション C は、iPlanet Application Server によってサポートされます。コミットオプション C は、トランザクション開始時に空きプールから Bean のインスタンスを取得し、トランザクション終了時に空きプールにインスタンスを戻します。

コミットオプション C における各ビジネスメソッド起動のライフサイクルは次のようになります。

ejbActivate-> ejbLoad -> business method -> ejbStore -> ejbPassivate

同じエンティティ EJBObject に同時にアクセスしているトランザクションクライアントが 1 つ以上ある場合、最初のクライアントはレディインスタンスを取得し、次の同時アクセスのクライアントはプールから新規インスタンスを取得します。


同時アクセスの処理

エンティティ Beans の開発者は、複数のトランザクションからのエンティティ Beans への同時アクセスについて心配する必要はありません。このような場合、Bean のコンテナは自動的に同期をとります。iPlanet Application Server では、コンテナは、Bean を使う各同時発生トランザクションのエンティティ Beans のインスタンスを活性化します。トランザクション同期は、データベースアクセス呼び出し時に基礎となっているデータベースによって自動的に実行されます。

iPlanet Application Server の EJB コンテナ実装には、複数のトランザクションがエンティティ Beans にアクセスするときの同期メカニズムがありません。すべての新規トランザクションにエンティティ Beans の新規インスタンスを作成します。iPlanet Application Server コンテナはアプリケーションの同期の責任を委譲します。

通常は、基礎となっているデータベースやリソースと連携して同期をとります。Bean 管理パーシスタンスを使用している場合の手法の 1 つは、たとえば適切な分離レベルを選択したり、select for update 句を使うことによって、ejbLoad() メソッド内で対応するデータベースをロックすることです。その特性は、使われているデータベースによって異なります。詳細については、EJB 仕様書の同時アクセスに関連する節を参照してください。

次の例に示す ejbLoad() のコード抜粋は、データベースロックを取得するための select for update シンタックスを示しています。これにより、ほかのインスタンスが同時に読み込まれることを防ぎます。

public void ejbLoad() throws java.rmi.RemoteException
{
....
// 対応するデータベーステーブルのロックを取得します。
   try {
       java.sql.Connection dbConn = ds.getConnection();
       String query = "SELECT accountNum, balance FROM accounts "
          + "WHERE customerId = ?FOR UPDATE";
       prepStmt = dbConn.prepareStatement(query);
       prepStmt.setString(1, m_customerId);
       resultSet = prepStmt.executeQuery();
       if ((resultSet != null) && resultSet.next()) {
          acctNum = resultSet.getInt(1);
          acctBalance = resultSet.getInt(2);
       } else {
          throw new RemoteException("Database error. "
                 + "Couldn't find accout");
       }
      catch (java.sql.SQLException e) {
       throw new RemoteException("Database error. "
             + "Couldn't load account");
   } finally {
      try {
          if (resultSet != null)
             resultSet.close();
          if (prepStmt != null)
             prepStmt.close();
          if (dbConn != null)
             dbConn.disconnect();
          } catch (java.sql.SQLException e) {
          System.out.println("Unexpected exception while "
             + "closing resources"); }
   }
}



コンテナ管理パーシスタンス



コンテナ管理パーシスタンス (CMP) を使うエンティティ Beans では、そのステート (またはパーシスタンス) の管理を iPlanet Application Server が行います。通常、CMP Bean はリレーショナルデータベースに従います。

開発者は CMP を使って、エンティティ Beans の作成作業を簡素化できます。CMP を使う開発者は、BMP エンティティ Beans の実装に必要な JDBC コードをすべて書き込む必要がなくなり、Bean 配置記述子を作成するためにツールを使うだけです。配置記述子には、リレーショナルデータベースのカラムを指す Bean にフィールドをマップするときにコンテナが使う情報が含まれています。

CMP の詳細については、EJB 1.1 仕様書の第 9.4 節を参照してください。

iPlanet Application Server には、CMP エンティティ Beans に関連する次のサポートが用意されています。

  • J2EE v 1.2 仕様の CMP モデル (例 : EJB 1.1) のフルサポート

  • サードパーティの O/R マッピングツールのサポート

  • 独創的ライトウェイト CMP の実装。ライトウェイト CMP の特長は次のとおりです。

    • iPlanet Application Server 配置ツール内の基本的なオブジェクトとリレーショナル (O/R) 間のマッピングツール。各 CMP Bean の XML 配置記述子を作成します。

    • 複合 (マルチカラム) プライマリキーのサポート

    • 高度なカスタムファインダーメソッドのサポート

    • 標準ベースクエリ言語 (SQL92)


J2EE 完全サポート

iPlanet Application Server は、EJB 1.1 仕様書に定義されているエンティティ Beans コンポーネント規約を完全サポートしています。次に主な項目を示します。

  • iPlanet Application Server は、EJB 1.1 仕様書に定義されているコミットオプション C を実装する

  • プライマリキークラスは、 java.lang.Object のサブクラスである必要がある。これは仕様書に準拠し、移植性を保証しますが、基本的なタイプ (intなど) をプライマリキークラスとして一覧表示するベンダーもあるので記載しています。


サードパーティの O/R マッピングツール

iPlanet Application Server ではサードパーティのツールベンダーの使用が認定されています。一般に、EJB1.1 仕様を完全にサポートする、サードパーティの CMP ソリューションは、iPlanet Web Server とともに動作します。

たとえば、Thought, Inc. は、マッピング EJB の高度な O/R マッピングソリューションとして、リレーショナルデータベースに CocoBase Enterprise を提供しています。Cocobase を使うには、Cocobase の O/R マッピングツールを使って EJB をビルドし、iPlanet Application Server の配置ツールまたは Command Line Interface (CLI) を使って Bean を配置します。

ほかのいくつかのベンダーは、現在、認定中です。認定済みサードパーティの O/R マッピングツールに関する現在の情報については、次の Web サイト developer.iplanet.com で確認してください。


CMP エンティティ Beans の例

CMP エンティティ Beans の例については、次の場所にある『J2EE Developerユs Guide』から製品サンプルアプリケーションを参照してください。

install_dir/ias/ias-samples/j2eeguide/product


ライトウェイト CMP 実装の使用法

iPlanet Application Server では、独創的なライトウェイト CMP 実装を提供しています。実装には iPlanet Application Server 配置ツールにあるマッピングツールと CMP 実行時環境が含まれています。CMP 実行時環境では、各 CMP Bean にパーシスタンスマネージャを作成します。パーシスタンスマネージャは XML 配置記述子で指定される情報を使います。CMP Bean で使われる 3 つの配置記述子は次のとおりです。

  • ejb-jar.xml - 各 EJB モジュールに ejb-jar.xml ファイルが 1 つあります。この配置記述子は EJB 1.1 仕様書に詳しく記述されています。

  • ias-ejb-jar.xml - ejb-jar.xml ファイルのように、EJB モジュールごとに ias-ejb-jar.xml ファイルが 1 つだけあります。ライトウェイト CMP を使うには、このファイルでプロパティを設定する必要があります。DTD の概要については、第 11 章「配置のためのパッケージ化」を参照してください。

  • property-file-name.xml - さらに、各 CMP Bean には、独自の配置記述子があります。ファイルの名前は ias-ejb-jar.xml ファイルで指定されています (properties-file-location 要素による。詳細については、第 11 章「配置のためのパッケージ化」を参照)。このファイルの内容で、リファレンス実装のパーシスタンスマネージャがどのようにしてリレーショナルデータベースに各 Bean ステートを読み込み、保存するかが決まります。

これらのファイルを生成するには 2 つの方法があります。次の節で各メソッドを詳しく説明します。


手動による配置記述子の作成

iPlanet Application Server 配置ツールの動作を理解するには、その背景で起きている内容を理解する必要があります。そのため、まず手動の手順を説明します。


ejb-jar 配置記述子

ejb-jar.xml ファイルについては EJB 1.1 仕様書に詳しく記述されています。ejb-jar 配置記述子は、Bean のトランザクション属性やコンテナ管理される Bean フィールドなど、重要な情報を指定します。対応する ias-ejb-jar.xml ファイルを指定する場合、J2EE 互換の ejb-jar ファイルは iPlanet Application Server 上に配置可能です。


ias-ejb-jar 配置記述子

Enterprise JavaBeans の J2EE ベンダー固有の情報は、別の配置記述子 ias-ejb-jar.xml に保存されます。この XML ベースの配置記述子の Document Type Definition (DTD) の詳細は、第 11 章「配置のためのパッケージ化」に記述されています。

<persistence-manager> 要素内に、このファイルに格納される CMP Bean に固有の情報があります。

  • パーシスタンスマネージャを作成するファクトリクラスの完全修飾クラス名は、<factory-class-name> 要素で指定されます。リファレンス実装のファクトリクラス名は、com.netscape.server.ejb.SQLPersistenceManagerFactory です。

  • ejb-jar.xml ファイル内の CMP Bean 固有のプロパティファイルの相対パスは、<properties-file-location> 要素で指定されます。

配置記述子の関連要素を示すコードの一部を次に示します。

...
   <persistence-manager>
       <factory-class-name>
          com.netscape.server.ejb.SQLPersistenceManagerFactory
       </factory-class-name>
       <properties-file-location>
          META-INF/MyProduct-ias-cmp.xml
       </properties-file-location>
   </persistence-manager>
...


CMP Bean 配置記述子

CMP Bean 固有の配置記述子のファイル名は、ias-ejb-jar.xml ファイルで指定されます。前述の例で、プロパティファイル名は、MyProduct-ias-cmp.xml でした。ファイルのルート要素は <ias-persistence-manager> ノードですが、その他はシンプルな Bean プロパティファイルです。ファイルは、1 つの XML フォーマットを使い、さまざまなプロパティを記述します。この配置記述子の DTD ファイルは次の場所にあります。

install_dir/ias/dtd/IASPersistence_manager_1_0.dtd

XML ファイルのタグは、この基本的なフォーマットに従います。

<bean-property>
   <property>
       <name></name>
       <type></type>
       <value></value>
       <delimiter></delimiter>
   </property>
</bean-property>

次に <property> のサブ要素の記述子を示します。

name

有効な名前dataSource, allFieldsfindByPrimaryKeySQLfindByPrimaryKeyParmsinsertSQLinsertParmsdeleteSQLdeleteParmsloadSQLloadParmsloadResults, storeSQLstoreParms の一つ、またはカスタムファインダーの名前です。

これらの各プロパティについてはこの節の後半で説明します。

type

java.lang.Stringjava.util.Vector のどちらか一方です。Vector がタイプとして使われる場合、値はカンマで区切られたリストとして扱われます。

value

任意の文字列です。

delimiter

常に , (カンマ) です。

次のプロパティは、ライトウェイト CMP Bean の配置記述子で定義されます。

  • データソース (dataSource)

  • CMP フィールドの RDB カラムへのマッピング (allFields)

  • パーシスタンスオペレーション

    • findByPrimaryKey (findByPrimaryKeySQL および findByPrimaryKeyParms)

    • insert (insertSQL および insertParms)

    • delete (deleteSQL および deleteParms)

    • load (loadSQLloadParms、およびloadResults)

    • store (storeSQL および storeParms)

    • カスタムファインダー (オプション)


データソース
XML ファイルで使われる最初のプロパティは、dataSourceです。dataSource プロパティの値は、パーシスタントストアとして使われる JDBC データソースの JNDI 名です。次のようにします。

...
   <bean-property>
       <property>
          <name>dataSource</name>
          <type>java.lang.String</type>
          <value>j2eeguide/ProductDB</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


CMP フィールドの RDB カラムへのマッピング
allFields プロパティは、O/R マッピングが指定される場所です。value 要素では、かっこで囲まれた文字列が CMP フィールドをデータベースカラムにマップします。CMP フィールドを = の左辺に位置し、データベースカラムを式の右辺に位置します。セミコロン で式を区切ります。次のようにします。

...
   <bean-property>
       <property>
          <name>allFields</name>
          <type>java.lang.String</type>
          <value>
       {description=DESCRIPTION;price=PRICE;productId=PRODUCTID;}
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


パーシスタンスオペレーション
パーシスタンスオペレーションは 3 つのプロパティタイプから構成されます。これらのプロパティは、次のネーミングパターンに従います。

  • xxxxSQL は、特定のパーシスタンスオペレーション (例 : insert) の SQL ステートメントです。xxxxSQL プロパティ内の SQL ステートメントは、java.sql.PreparedStatement を作成するときに使われるため、パラメータ化されたクエリに指定されたルールに従う必要があります (たとえば、パラメータを示すために ? を使用するなど)。SQL データタイプに CMP フィールドをマップする方法を理解するには、「マッピングルール」を参照してください。

  • xxxxParms は、パーシスタンスオペレーションに送られるパラメータのリストです。最初のフィールドは SQL ステートメント (? で表される) の最初のパラメータにマップされ、2 番目のフィールドは 2 番目のパラメータにマップされます。

  • xxxxResults は、 PreparedStatement の実行で返される ResultSet 内のフィールドのリストです。

名前の xxxx は次のどれかです。

  • findByPrimaryKey (findByPrimaryKeySQL および findByPrimaryKeyResults)

  • insert (insertSQL および insertParms)

  • delete (deleteSQL および deleteParms)

  • load (loadSQLloadParms、およびloadResults)

  • store (storeSQL および storeParms)

  • カスタムファインダー名

パーシスタンスオペレーションプロパティは、CMP Bean にシングルフィールドプライマリキーまたはマルチフィールドプライマリキーがあるかどうかによって異なります。異なる点を次の例に示します。


findByPrimaryKey
findByPrimaryKey プロパティは、findByPrimaryKeySQL および findByPrimaryKeyParms です。findByPrimaryKeyResults プロパティはすでにプライマリキークラスで定義済みなので、findByPrimaryKey プロパティに指定する必要はありません。このオペレーションは、EJBのホームインタフェース内の findByPrimaryKey() メソッドに該当します。

次にシングルフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>findByPrimaryKeySQL</name>
          <type>java.lang.String</type>
          <value>
             SELECT PRODUCTID FROM PRODUCT WHERE PRODUCTID = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>findByPrimaryKeyParms</name>
          <type>java.util.Vector</type>
          <value>productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...

次にマルチフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>findByPrimaryKeySQL</name>
          <type>java.lang.String</type>
          <value>
     SELECT PRODUCTID, DESCRIPTION FROM PRODUCT WHERE PRODUCTID = ?AND DESCRIPTION = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>findByPrimaryKeyParms</name>
          <type>java.util.Vector</type>
          <value>productId,description</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


insert
insert プロパティは、insertSQL および insertParmsです。insert オペレーションは、シングルおよびマルチフィールドプライマリキーでまったく同じです。このプロパティは、Bean のホームインタフェース内の create() メソッドに該当します。

...
   <bean-property>
       <property>
          <name>insertSQL</name>
          <type>java.lang.String</type>
          <value>
INSERT INTO PRODUCT ( DESCRIPTION,PRICE,PRODUCTID ) VALUES(?,?,?)
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>insertParms</name>
          <type>java.util.Vector</type>
          <value>description,price,productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


delete
delete プロパティは、deleteSQL および deleteParms です。delete オペレーションは、Bean のホームインタフェース内の remove() 関数を有効にします。

次にシングルフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>deleteSQL</name>
          <type>java.lang.String</type>
          <value>DELETE FROM PRODUCT WHERE PRODUCTID = ?</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>deleteParms</name>
          <type>java.util.Vector</type>
          <value>productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...

次にマルチフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>deleteSQL</name>
          <type>java.lang.String</type>
          <value>
       DELETE FROM PRODUCT WHERE PRODUCTID = ?AND DESCRIPTION = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>deleteParms</name>
          <type>java.util.Vector</type>
          <value>productId,description</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


load
load プロパティは、loadSQLloadParms、および loadResults です。load オペレーションは、シングルおよびマルチフィールドプライマリキーでほぼ同じです。したがって、loadSQL プロパティと loadParms プロパティに大きな違いはありません。load オペレーションは、EJBの ejbLoad() メソッドに該当します。

次にシングルフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>loadSQL</name>
          <type>java.lang.String</type>
          <value>
SELECT DESCRIPTION,PRICE,PRODUCTID FROM PRODUCT WHERE PRODUCTID = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>loadParms</name>
          <type>java.lang.String</type>
          <value>productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>loadResults</name>
          <type>java.util.Vector</type>
          <value>description,price,productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...

次にマルチフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>loadSQL</name>
          <type>java.lang.String</type>
          <value>
SELECT DESCRIPTION,PRICE,PRODUCTID FROM PRODUCT WHERE PRODUCTID = ?AND DESCRIPTION = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>loadParms</name>
          <type>java.util.Vector</type>
          <value>productId,description</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>loadResults</name>
          <type>java.util.Vector</type>
          <value>description,price,productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


store
store プロパティは、storeSQL および storeParms です。プロパティを読み込む場合、storeSQLstoreParms プロパティは多少異なります。マルチフィールドプライマリキー内が正しい順序になるように確認してください。Bean 実装で、EJB コンテナが ejbStore() メソッドを呼び出すと、store オペレーションが実行されます。

次にシングルフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>storeSQL</name>
          <type>java.lang.String</type>
          <value>
       UPDATE PRODUCT SET DESCRIPTION=?,PRICE=?WHERE PRODUCTID = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>storeParms</name>
          <type>java.util.Vector</type>
          <value>description,price,productId</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...

次にマルチフィールドプライマリキーの例を示します。

...
   <bean-property>
       <property>
          <name>storeSQL</name>
          <type>java.lang.String</type>
          <value>
    UPDATE PRODUCT SET PRICE=?WHERE PRODUCTID = ?AND DESCRIPTION = ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>storeParms</name>
          <type>java.util.Vector</type>
          <value>price,productId,description</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


カスタムファインダー
オプションで、カスタムファインダーを配置記述子に追加できます。カスタムファインダーオペレーションのルールは、ほかのオペレーションと少し異なります。

  • カスタムファインダーの xxxxSQL プロパティでは、ホームインタフェースで定義されているファインダーメソッドへの最初の引数が、SQL ステートメント内の最初のパラメータにマップされ、2 番目の引数は 2 番目のパラメータにマップされます。

  • カスタムファインダーの xxxxResults プロパティは、SQL ステートメントの ResultSet のカラムをプライマリキーのフィールド (マルチフィールドプライマリキーのフィールド) またはプライマリキー自体 (シングルフィールドプライマリキーのフィールド) にマップします。

たとえば、次に示すメソッドがエンティティ Beans のホームインタフェースで定義されると仮定します。

public Collection findInRange(double low, double high)
throws FinderException, RemoteException;

プロパティ名は Bean のホームインタフェースに存在する名前です。この例のオペレーションでは、配置記述子内に 3 つのプロパティfindInRangeSQL, findInRangeParms および findInRangeResults (マルチフィールドプライマリキーだけに必要) を持つ可能性があります。

次に、このオペレーションを実装するシングルフィールドプライマリキーのプロパティを示します。

...
   <bean-property>
       <property>
          <name>findInRangeSQL</name>
          <type>java.lang.String</type>
          <value>
          SELECT PRODUCTID FROM PRODUCT WHERE PRICE BETWEEN ?AND ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>findInRangeParms</name>
          <type>java.lang.Vector</type>
          <value>low,high</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...

次に、このオペレーションを実装するマルチフィールドプライマリキーのプロパティを示します。

...
   <bean-property>
       <property>
          <name>findInRangeSQL</name>
          <type>java.lang.String</type>
          <value>
       
SELECT PRODUCTID, DESCRIPTION FROM PRODUCT WHERE PRICE BETWEEN ?AND ?
          </value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>findInRangeParms</name>
          <type>java.lang.Vector</type>
          <value>low,high</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
   <bean-property>
       <property>
          <name>findInRangeResults</name>
          <type>java.util.Collection</type>
          <value>productid,description</value>
          <delimiter>,</delimiter>
       </property>
   </bean-property>
...


マッピングルール
ライトウェイト CMP は JDBC (特に PreparedStatement インタフェースのセッターメソッド) を使い、リレーショナルデータベーステーブルのカラムに CMP フィールドをマップします。そのため、標準 JDBC マッピングルールが CMP フィールドに適用されます。

たとえば、SQL カラムに java.lang.String をマップするには、ライトウェイト CMP が PreparedStatement インタフェース内の setString メソッドを使います。PreparedStatement インタフェースのドキュメントでは、setStringVARCHAR にマップすることを指定しています。

ライトウェイト CMP は、すべての固有の Java フィールドタイプ、固有のタイプを表すすべてのクラス (例 : Integer)、java.lang.String、java.sql.Date、java.sql.Time、java.sql.Timestamp、および任意の直列化可能なオブジェクトをサポートしています。表 6-1 では、Bean 属性とテーブルカラム間のマッピングを説明しています。


表 6-1    EJB/JDBC マッピング 

Java のタイプ

JDBC のタイプ

JDBC ドライバアクセスメソッド

boolean  

BIT  

getBoolean()setBoolean()  

byte  

TINYINT  

getByte()setByte()  

short  

SMALLINT  

getShort()setShort()  

int  

INTEGER  

getInt()setInt()  

long  

BIGINT  

getLong()setLong()  

float  

FLOAT  

getFloat()setFloat()  

double  

DOUBLE  

getDouble()setDouble()  

byte[]  

VARBINARY または LONGVARBINARY(1)  

getBytes()setBytes()  

java.lang.String  

VARCHAR または LONGVARCHAR(1)  

getString()setString()  

java.lang.Boolean  

BIT  

getObject()setObject()  

java.lang.Integer  

INTEGER  

getObject()setObject()  

java.lang.Long  

BIGINT  

getObject()setObject()  

java.lang.Float  

REAL  

getObject()setObject()  

java.lang.Double  

DOUBLE  

getObject()setObject()  

java.math.BigDecimal  

NUMERIC  

getObject()setObject()  

java.sql.Date  

DATE  

getDate()setDate()  

java.sql.Time  

TIME  

getTime()setTime()  

java.sql.Timestamp  

TIMESTAMP  

getTimestamp()setTimestamp()  

任意の直列化可能なクラス  

VARBINARY または LONGVARBINARY(1)  

getBytes()setBytes()  


配置ツールの使用法

CMP Bean の標準 ejb-jar 配置記述子を作成する簡単な方法は、iPlanet Application Server 配置ツールを使うことです。このツールの広範囲な組み込みを利用すると、配置記述子の作成方法についての詳細がわかります。

既存の EJB モジュールを開くか、または新しい EJB モジュールを作成することによって開始します。このツールを使った CMP Bean の作成方法の詳細については、ツール内のヘルプを参照してください。EJB クラスファイルに EJB モジュールが追加されていれば、図 6-1 のように、Bean上で右クリックし、その記述子を編集できます。

図 6-1    iPlanet Application Server 配置ツールで Bean を選択



配置記述子を開くと、ユーザインタフェースでの変更は、ejb-jar.xml 配置記述子の CMP EJB セクション、ias-ejb-jar.xml 配置記述子の CMP EJB セクション、および CMP Bean 固有の配置記述子に反映されます。CMP Bean のマッピング情報は、ejbname-ias-cmp.xml という名前のファイルに保存されます。ユーザインタフェースの要素の詳細については、ツールのヘルプを参照してください。

図 6-2 では「ライトウェイト CMP」タブを示します。

図 6-2    「ライトウェイト CMP」タブ



前述の節で手動による配置記述子の作成について理解すると、「ライトウェイト CMP」タブの内容がわかりやすくなります。例外を次に説明します。

  • 「TABLE」テキストボックスは、指定のデータソースを介してアクセスするリレーショナルデータベーステーブルの入力フィールドです。

  • 各 EJB 属性にキーフィールドを切り替えることができます。マルチフィールドプライマリキーを作成するには、2 つ以上の属性を true に設定するだけです。変更は Bean の対応する配置記述子に反映されます(マルチフィールドプライマリキーは、EJB 1.1 仕様書に定義されているプライマリキークラスの内容などのほかの変更も必要とします)。

  • カスタムファインダーには、「Name」、「Type」、および「Value」フィールドを使います。これらのフィールドの使用法は前述の節で説明した方法と同じです。



    iPlanet Application Server 配置ツール内で EJBの 配置記述子の作成を開始し、ツールにアプリケーションを保存し、手動でファイルを編集してツールに戻ることができます。ただし、この作業を行う場合、配置記述子を編集する前に、必ずツール内の EJB モジュールあるいは J2EE アプリケーションを再び開き、変更後にツールにアプリケーションを保存してください。失敗した場合は、ユーザインタフェースでの変更は配置記述子に反映されません。




前へ     目次     索引     DocHome     次へ     
Copyright © 2002 Sun Microsystems, Inc. All rights reserved.

最新更新日 2002 年 3 月 6 日