Sun ONE ロゴ     前へ      目次      索引      次へ     
Sun ONE Application Server 7 Enterprise Java Beans 開発者ガイド



エンティティ Beans のコンテナ管理による持続性の使用

この章では、Sun ONE Application Server 7 環境でのコンテナ管理による持続性の動作に関する情報、および実装の手順を示します。



コンテナ管理による持続性を実装するには、エンティティ Beans について理解している必要があります。エンティティ Beans については、「エンティティ Beans の使用」で説明しています。



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

コンテナ管理による持続性に関する詳細情報は、『Enterprise JavaBeans Specification, v2.0』の第 10 章、第 11 章、および第 14 章にあります。

Sun ONE Application Server でのサポート

Sun ONE Application Server でのコンテナ管理による持続性のサポート内容は、次のとおりです。

  • J2EE v 1.3 仕様のコンテナ管理持続モデルのフルサポート
    • トランザクションのコミットオプション B、C のサポートは、『Enterprise JavaBeans Specification, v2.0』に定義されている。詳細は、「コミットオプション」を参照
    • 主キークラスは、java.lang.Object のサブクラスである必要がある。これにより移植性が保証される。これは、基本的なタイプ (intなど) を主キークラスとして一覧表示できるベンダーもあるので記載している

  • 次の機能を提供する Sun ONE Application Server のコンテナ管理による持続性の実装
    • コンテナ管理による持続性を使用する Beans を含む EJB JAR ファイルの XML 配備記述子を作成するオブジェクトとリレーショナル間の (O/R) マッピングツール (Sun ONE Application Server Assembly Tool の一部)
    • 複合 (マルチカラム) 主キーのサポート
    • 高度なカスタム検索メソッドのサポート
    • 標準ベースクエリ言語 (EJB QL)
    • コンテナ管理による持続性のランタイムによる次の JDBC ドライバ/データベースのサポート
      • Oracle 8i、Oracle 9
      • Sybase 12
      • Microsoft SQLServer 2000
      • Pointbase 4.2 (Solaris と同時にプリインストールした Sun ONE Application Server には含まれない)

  • サードパーティによるオブジェクトとリレーショナル間の (O/R) マッピングツールのサポート。サードパーティ API については、「サードパーティ製のプラグイン可能な持続性管理 API」を参照

コンテナ管理による持続性について

コンテナ管理による持続性 (CMP) を使用するエンティティ Bean では、その状態 (または持続性) の管理を Sun ONE Application Server コンテナに委託します。コンテナ管理による持続性を実装する開発者は、Bean 管理による持続性の実装に必要な JDBC コードを記述する代わりに、ツールを使用して Bean 配備記述子を作成します。作成した配備記述子は、リレーショナルデータベースのカラムに Bean フィールドをマップするときにコンテナが使う情報を提供します。

EJB コンテナでコンテナ管理による持続性をサポートするには、次の 2 つを必要とします。

  • マッピング - リレーショナルデータベースの表などのリソースにエンティティ Beans をマップする方法に関する情報
  • 実行時環境 - マッピング情報を使って各 Bean で持続性操作を実行する、コンテナ管理による持続性の実行時環境

この節では、コンテナ管理による持続性に関する次の項目について説明します。

CMP コンポーネント

Bean 管理による持続性とは異なり、コンテナ管理による持続性では、エンティティ Bean クラスのメソッドにデータベースアクセス呼び出しを記述する必要はありません。持続性は実行時にコンテナによって処理されるので、コンテナがデータアクセスを処理する持続性フィールドおよび関係を配備記述子に指定する必要があります。持続的なデータにアクセスするには、抽象持続性スキーマとして定義されたアクセサメソッドを使用します。

コンテナ管理による持続性を使用するエンティティ Bean は、次のような相互運用コンポーネントで構成されます。

  • 開発者が作成した抽象 Bean クラス
  • 開発者が作成したリモートインタフェース
  • 開発者が作成したローカルインタフェース
  • 開発者が作成した配備記述子
  • 開発者が作成した主キークラス (省略可能)
  • コンテナ管理による持続性の実装によって生成された具象 Bean クラス
  • このクラスは抽象 Bean クラスを継承し、配備記述子からの情報を使用する。Bean クラス内のアクセサ (読み取り) メソッドとミュテータ (書き込み) メソッドは、このクラスで具象状態クラスに実装される

  • コンテナ管理による持続性の実装によって生成された具象リモート Bean 実装クラス
  • コンテナ管理による持続性の実装によって生成された EJBObject (スケルトン)
  • コンテナ管理による持続性の実装によって生成されたリモートスタブ

コンテナ管理による持続性では、次のクラスが使用されます。

  • 生成クラス - ejbc コンパイルユーティリティから呼び出され、具象クラスを生成する
  • 生成済みクラス - コンテナ管理による持続性を使用して、サーバー実行時の持続性動作をもたらす
  • 管理クラス - サーバー実行時の統計情報を収集および報告する

関係



この項は、コンテナ管理による持続性 2.0 Beans を使用する場合だけ適用されます。



関係により、オブジェクトから関連オブジェクトに移動することができます。関係の方向には、双方向と一方向があります。

  • 双方向 - 各エンティティ Bean が、他方の Bean を参照する関係フィールドを持つ。関係フィールドにより、エンティティ Bean のコードで関連オブジェクトにアクセスできる。エンティティ Bean が関係ールドを持つ場合、そのエンティティ Bean は関連オブジェクトについて「知っている」と言える
  • 一方向 - 一方のエンティティ Bean のみが、他方の Bean を参照する関係フィールドを持つ


  • 関係が一方向であっても、その関係に変更を加えれば、その関係によって関連付けられているほかの Enterprise JavaBean も影響を受けます。



2 つのクラス内のフィールド間のコンテナ管理関係 (CMR) により、関係の片方での操作を他方にも反映することができます。実行時に、あるインスタンスのフィールドが別のインスタンスを参照するように変更されると、参照先のインスタンスの関係フィールドも、関係の変更を反映するように修正されます。



管理関係内の 1 つのオブジェクトを削除する場合、警告は表示されません。コンテナ管理による持続性は、確認を求めずに、外部キー側の関係を無効にしてオブジェクトを削除します。



Java コードでは、基本的な関係によって、オブジェクト参照 (EJB ローカルインタフェースに入力されたコレクションまたはフィールド) で関係を表します。関係に含まれる各クラスのインスタンス数によって、一対一、一対多、または多対多の関係があります。データベースでは、これを外部キーカラムによって表し、多対多の関係では、表を結合することができます。

次の各節では、各種の関係について説明します。

一対一の関係

一対一の関係では、両方のクラス内に、タイプとして他方の Bean タイプのローカルインタフェースを持つ単一値フィールドがあります。関係のどちらか一方のフィールドが変更されると、関係の変更として処理されます。一方の側のフィールドが null から null 以外に変更されると、もう一方の側のフィールドは、このインスタンスを参照するように変更されます。もう一方の側のフィールドがすでに null 以外になっている場合は、その変更を行う前に、その関係が null にされます。

一対多の関係

一対多の関係では、多側に単一値フィールドがあり、一側に複数値フィールド (コレクション) があります。

コレクションフィールドにインスタンスが追加されると、新しいインスタンスのフィールドは、そのコレクションフィールドを保有するインスタンスを参照するように更新されます。コレクションからインスタンスが削除されると、そのインスタンスのフィールドは null になります。

多側のフィールドの追加または削除は、関係の変更として処理されます。多側のフィールドが null から null 以外に変更されると、一側のコレクション値フィールドにそのインスタンスが追加されます。多側のフィールドが null 以外から null に変更されると、一側のコレクション値フィールドからそのインスタンスが削除されます。

多対多の関係

多対多の関係では、関係の両側に複数値 (コレクション) フィールドがあります。関係のどちらかの側のコレクションの内容が変更されると、関係の変更として処理されます。一方の側のコレクションにインスタンスが追加されると、このインスタンスがもう一方の側のコレクションに追加されます。一方の側のコレクションからインスタンスが削除されると、このインスタンスがもう一方の側のコレクションから削除されます。

抽象スキーマ

エンティティ Beans の配備記述子の一部である抽象スキーマは、Bean の持続フィールドおよび関係を定義します。抽象という言葉によって、このスキーマは、基になるデータストアの物理スキーマと区別されます。

抽象スキーマの名前は、配備記述子に指定します。この名前は、EJB クエリ言語 (EJB QL) で記述されたクエリによって参照されます。コンテナ管理による持続性を使用するエンティティ Beans では、すべての検索メソッドに対して EJB-QL クエリを定義する必要があります (findByPrimaryKey を除く)。EJB-QL クエリは、検索メソッドが起動されたときに EJB コンテナが実行するクエリを決定します。

<ejb-relation>
   <ejb-relation-name>OrderLineItem</ejb-relation-name>
   <ejb-relationship-role>
       <ejb-relationship-role-name>
          OrderHasLineItems
       </ejb-relationship-role-name>
       <multiplicity>One</multiplicity>
       <relationship-role-source>
          <ejb-name>Order</ejb-name>
       </relationship-role-source>
       <cmr-field>
          <cmr-field-name>lineItems</cmr-field-name>
          <cmr-field-type>java.util.Collection</cmr-field-type>
       </cmr-field>
   </ejb-relationship-role>
<ejb-relationship-role>
   <ejb-relationship-role-name>
       LineItemInOrder
   </ejb-relationship-role-name>
   <multiplicity>Many</multiplicity>
   <relationship-role-source>
          <ejb-name>LineItemEJB</ejb-name>
       </relationship-role-source>
   </ejb-relationship-role>
</ejb-relation>

配備記述子

作成したコンテナ管理フィールドがデータベースフィールドにマップされる場合は、マッピングに関する情報を配備担当者に連絡する必要があります。コンテナ管理による持続性 Beans を含む各モジュールは、配備のために次のファイルが必要です。

持続性マネージャ

Sun ONE Application Server では、コンテナ管理による持続性モデルは、Pluggable Persistence Manager API に基づきます。この API は、エンティティ Beans と持続性ストア間のマッピングを定義およびサポートするときに、持続性マネージャの役割をします。

持続性マネージャは、コンテナにインストールされたエンティティ Beans の持続性を処理するコンポーネントです。持続性マネージャベンダーが提供するクラスは、エンティティ Beans 間の関係および持続的な状態へのアクセスを管理します。持続性マネージャベンダーは、コンテナ管理関係の維持に使用される Java クラスの実装も行います。持続性マネージャは、コンテナから提供されるデータソースレジストリを使ってデータソースにアクセスします。

次の図は、Sun ONE Application Server 環境で持続性がどのように機能するかを示しています。


GeBeB Beans t[} (}l[WAgUNV}l[WABMP/CMP BeansAf[^x[X)

カスタム持続性マネージャを作成してレガシーシステムをサポートしたり、キャッシュストラテジを実装してコンテナ管理による持続性ソリューションのパフォーマンスを高めることもできます。

コンテナ管理による持続性の使用

コンテナ管理による持続性を使用するエンティティ Beans の実装の主な内容は、マッピングとアセンブリ、配備です。



コンテナ管理フィールドに割り当てる Java のタイプは、Java 基本タイプ、Java 直列化可能タイプ、および EJB のリモートインタフェースまたはリモートホームインタフェースの参照に制限する必要があります。



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

プロセスの概要

コンテナ管理による持続性のプロセスは、マッピング、配備、および実行の 3 つのオペレーションで構成されます。これらのオペレーションについては、次の各フェーズで説明します。

フェーズ 1. マッピング配備記述子ファイルの作成



Sun ONE Studio IDE は、配備用にこの記述子を自動的に生成します。



このフェーズは、Sun ONE Studio 4 IDE でのコンテナ管理による持続性の開発と並行して実行するか、または開発後の配備準備の段階で実行します。

このフェーズでは、CMP フィールドおよび CMR フィールド (関係) をデータベースにマップします。コンテナ管理による持続性 Bean ごとに主表を選択し、オプションで複数の二次表を選択します。CMP フィールドは、主表または二次表のカラムにマップします。CMR フィールドは、カラムリスト (通常は主キーと外部キーのペアに関連付けられたカラムのリスト) のペアにマップします。

  • マッピングは、sun-cmp-mapping_1_0.dtd に準拠したファイルに保存される。結果の XML ファイルは、EJB JAR ファイル内のユーザー定義 Bean クラスとともにパッケージ化される。この XML ファイルは META-INF/sun-cmp-mappings.xml という名前である必要がある
  • エラーは配備プロセスで報告される。エラーは、Sun ONE Studio 4 環境内、またはコマンド行で引き起こされることがある
  • マッピング情報は、データベーススキーマファイルと連動して開発される。このファイルは、Sun ONE Studio 4 IDE (「スキーマの取り込み」)、またはキャプチャスキーマユーティリティ (「キャプチャスキーマユーティリティの使用」) を使って取り込む必要がある
  • データベースの表の構造を変更した場合は、データベース管理者が表を更新した後で、まず、変更した表のスキーマを取り込む。次に CMP フィールドと関係をマップし直す


  • この再マッピングを自動的に実行する方法はないので、手動で実行する必要があります。



フェーズ 2. 具象 Beans および委託の生成とコンパイル

このフェーズは、EJB アプリケーションを Sun ONE Application Server に配備するときに実行します。このフェーズでは、フェーズ 1 で作成したマッピング情報と配備情報を結合します。

次のファイルが生成されます。

  • 作成した抽象 Bean を拡張する具象 Bean ファイル
  • 具象 Bean は、EJB ライフサイクルメソッドの ejbSetEntityContextejbUnsetEntityContextejbCreateejbRemoveejbLoadejbStore を実装する。また、各 CMP フィールドと CMR フィールドの getXXXsetXXXejbFindByPrimaryKey、その他の検索メソッド、およびユーザーが定義したセレクタメソッドも実装する

  • プロパティファイルとして保存された、検索メソッドとセレクタメソッドのコンパイル済み EJB-QL
  • このファイルには、コンテナ管理による持続性のクエリパラメータリスト、クエリフィルタ、クエリ順序式、クエリ候補クラス名、およびクエリ結果タイプが格納される

  • EJB-QL 構文や使用法などに関するエラーを報告する生成ログファイル
  • 状態クラスとヘルパークラス

フェーズ 3. Sun ONE Application Server 実行時の稼動

配備時に提供した情報は、Enterprise JavaBean として実装されたエンティティで要求を処理するときに使用されます。

マッピング機能

マッピングは、データのオブジェクト指向モデルを、関係モデル (通常はリレーショナルデータベースのスキーマ) に関連付ける機能です。コンテナ管理による持続性を実装すると、データおよび関連動作を保持した相互関係のクラスのセットを、相互関係のスキーマのメタデータに関連付けることができます。その後、データベースのこのオブジェクト表現を使用して、Java アプリケーションの基礎を構成できます。また、このマッピングをアプリケーション固有のニーズに応じてカスタマイズし、基礎となるこれらのクラスを最適化することもできます。

結果は単一のデータモデルであり、これを通して持続的なデータベース情報および通常の一時的なプログラムデータの両方にアクセスできます。そのため、Java プログラミング言語オブジェクトだけを理解すればよく、基礎となるデータベーススキーマについて理解する必要がありません。

コンテナ管理による持続性の DTD および XML ファイルの要素については、「sun-cmp-mappings.xml ファイルの要素」を参照してください。

マッピングの各機能

Sun ONE Application Server で提供されるマッピング機能を次に示します。

  • コンテナ管理による持続性 Bean を単一の表にマップする
  • コンテナ管理による持続性 Bean を複数の表にマップする
  • コンテナ管理による持続性のフィールドをカラムにマップする
  • コンテナ管理による持続性のフィールドを別々のカラムタイプにマップする
  • 複合主キーで表をマップする
  • コンテナ管理による持続性の関係を外部キーカラムにマップする
  • オーバーラップする主キーおよび外部キーで表をマップする

マッピングツール

マッピングツールは、エンティティ Bean のコンテナ管理フィールドを、リレーショナルデータベースの表のカラムなどのデータソースにマップするための情報を生成します。このマッピング情報は、XML ファイルに保存されます。

コンテナ管理による持続性の実装の meet-in-the-middle マッピングでは、マッピングツールを使用して、既存のスキーマと既存の Java クラス間のカスタムマッピングを作成します。

マッピングの技法

コンテナ管理による持続性のクラスは、従業員や部署などのデータエンティティを表します。特定のデータエンティティをモデル化するには、データストア内のカラムに対応するクラスに持続的なフィールドを追加します。

もっとも単純なモデル化の方法は、持続性機能のあるクラスで、データストア内の 1 つの表を表すことです。このとき、表のカラムごとに持続的なフィールドを設定します。たとえば、Employee クラスに、データストアの EMPLOYEE 表内にあるすべてのカラム (lastnamefirstnamedepartmentsalary など) と対応する持続的なフィールドを設定します。



持続的なフィールドとして使用するデータストアのカラムのサブセットのみを設定できますが、フィールドが持続的な場合は、そのフィールドをマップする必要があります。



Sun ONE Studio 4 を使って Enterprise JavaBean 用にコンテナ管理による持続性をマップする方法については、Sun ONE Studio 4 のオンラインヘルプで「Sun ONE Application Server Integration Module」を参照してください。

マッピングでサポートされているデータタイプ

コンテナ管理による持続性は、Java データフィールドを SQL タイプにマップするときに使用される JDBC 1.0 SQL データタイプセットをサポートしています。サポートしている JDBC 1.0 SQL データタイプは次の表のとおりです。

                      サポートしている JDBC 1.0 SQL データタイプ

BIGINT

 

DOUBLE

 

SMALLINT

 

BIT

 

FLOAT

 

TIME

 

BLOB

 

INTEGER

 

TIMESTAMP

 

CHAR

 

LONGVARCHAR

 

TINYINT

 

DATE

 

NUMERIC

 

VARCHAR

 

DECIMAL

 

REAL

 

 

推奨されるマッピングは次の表のとおりです。

   データタイプの推奨マッピング 

Java のタイプ

JDBC のタイプ

NULL/NON NULL

boolean

 

BIT

 

NON NULL

 

java.lang.Boolean

 

BIT

 

NULL

 

byte

 

TINYINT

 

NON NULL

 

java.lang.Byte

 

TINYINT

 

NULL

 

double

 

FLOAT

 

NON NULL

 

java.lang.Double

 

FLOAT

 

NULL

 

double

 

DOUBLE

 

NON NULL

 

java.lang.Double

 

DOUBLE

 

NULL

 

float

 

REAL

 

NON NULL

 

java.lang.Float

 

REAL

 

NULL

 

int

 

INTEGER

 

NON NULL

 

java.lang.Integer

 

INTEGER

 

NULL

 

long

 

BIGINT

 

NON NULL

 

java.lang.Long

 

BIGINT

 

NULL

 

long

 

DECIMAL (scale==0)

 

NON NULL

 

java.lang.Long

 

DECIMAL (scale==0)

 

NULL

 

long

 

NUMERIC (scale==0)

 

NON NULL

 

java.lang.Long

 

NUMERIC (scale==0)

 

NULL

 

short

 

SMALLINT

 

NON NULL

 

java.lang.Short

 

SMALLINT

 

NULL

 

java.math.BigDecimal

 

DECIMAL (scale!=0)

 

NON NULL

 

java.math.BigDecimal

 

DECIMAL (scale!=0)

 

NULL

 

java.math.BigDecimal

 

NUMERIC

 

NULL

 

java.math.BigDecimal

 

NUMERIC

 

NON NULL

 

java.lang.String

 

CHAR

 

NON NULL

 

java.lang.String

 

CHAR

 

NULL

 

java.lang.String

 

VARCHAR

 

NON NULL

 

serializable

 

BLOB

 

NULL

 

BLOB のサポート

Binary Large Object (BLOB) は、複雑なオブジェクトフィールドの格納と取得に使用されるデータタイプです。BLOB は、画像など、大きいバイト配列に変換し、その後 CMP フィールドに直列化されるバイナリまたは直列化可能なオブジェクトです。



Oracle thin ドライバ (Type 4 JDBC) を使用する Oracle では 2000 バイトを超えるデータをカラムに挿入することはできません。この問題を回避するには、OCI ドライバ (Type 2 JDBC) を使います。



Sun ONE Application Server 環境で BLOB のサポートを有効にするには、次のようにします。

  1. Bean クラスで変数のタイプを直列化可能として宣言します。
  2. XML ファイルを編集して、sun-cmp-mappings.xml ファイル内で CMP マッピング配備記述子を宣言します。
  3. データベースに BLOB を作成します。


  4. BLOB オブジェクトはサイズが大きいため、パフォーマンスに悪影響を及ぼすことがあります。



<cmp-field-mapping>
   <field-name>syllabus</field-name>
   <column-name>COURSE.SYLLABUS</column-name>
</cmp-field-mapping>

/******************************************************
Serializable class Syllabus : BLOB Testing
******************************************************/

package collegeinfo
public class Syllabus implements java.io.Serializable
{
   public String author;
   public String syllabi;
}

Schema for Course:

table course
------------
courseId Number
deptId Number
courseName Varchar
syllabus BLOB

キャプチャスキーマユーティリティの使用

マッピング情報を開発するときは、まず、データベーススキーマを取り込みます。マッピングと実行のためにデータベースメタデータ (スキーマ) を格納するときは、capture-schema コマンドを使います。また、Sun ONE Studio (従来の Forte for Java) IDE を使ってデータベーススキーマを取り込むこともできます。詳細については、「スキーマの取り込み」を参照してください。

構文

capture-schema -dburl url -username name  -password password -driver ajdbcdriver [-schemaname name] [-table TableName]* [-out filename]

指定箇所:

-dburl url: ドライバがデータベースにアクセスするための JDBC URL を指定する

-username name: データベースへのアクセスを認証するユーザー名を指定する

-password password: 指定したデータベースにアクセスするためのパスワードを指定する

-driver ajdbcdriver: JDBC ドライバのクラス名を指定する。このクラスは、作業環境の CLASSPATH に含まれている必要がある

-schemaname name: 取り込むユーザースキーマの名前を指定する。指定しない場合は、指定したユーザーがアクセスできるすべてのスキーマからすべての表のメタデータが取り込まれる



このパラメータを指定することを強くお勧めします。指定したユーザーが複数のスキーマにアクセスできる場合、同じ名前の複数の表が取り込まれ、問題が生じることがあります。



-table TableName: 表名を指定する。複数の表名を指定できる。指定しない場合は、データベーススキーマ内のすべての表が取り込まれる

-out: 出力先を指定する。デフォルトの出力先は stdout である。CMP マッピング用の出力として利用するには、出力ファイル名のサフィックスを .dbschema にする必要がある

コンテナ管理による持続性のマッピングでは、-out パラメータは sun-cmp-mapping_1_0.dtd ファイルの sun-cmp-mapping 要素に含まれる schema サブ要素と相互に関連する

   <!ELEMENT sun-cmp-mapping (schema, entity-mapping+) >

sun-cmp-mappings.xml ファイルでは、この要素は .dbschema というサフィックスなしで表される。たとえば、次のように表示される

   <schema>RosterSchema</schema>



表フラグを指定しない場合は、データベース内のすべての表がスキーマに取り込まれます。



capture-schema -dburl jdbc:pointbase:server://localhost:9092/sample -username public -password public -driver com.pointbase.jdbc.jdbcUniversalDriver -out RosterSchema.dbschema

フィールドおよび関係のマッピング

ここでは、sun-cmp-mappings.xml 配備記述子を編集して、エンティティ Beans のフィールドおよび関係をマップする方法を説明します。この作業は、手動で行う (XML の編集に精通している場合のみ) か、または Sun ONE Application Server のアセンブルと配備用のツールを使用します。

コンテナ管理による持続性は、名前、主表、1 つ以上のフィールド、0 個以上の関係、0 個以上の二次表、および整合性チェック用フラグを持ちます。sun-cmp-mappings.xml ファイルの要素を使用して、CMP フィールドおよび CMR フィールドをデータベースにマップする必要があります。CMP フィールドはデータベースの主表または二次表のカラムにマップし、CMR フィールドはカラムリストのペアにマップします。

コンテナ管理による持続性の配備記述子のマッピング要素は、「sun-cmp-mappings.xml ファイルの要素」にアルファベット順に記載されています。サンプルの XML ファイルについては、「スキーマ定義の例」を参照してください。

ここでは、次のマッピング作業を実施するための手順を示します。

マップする Beans の指定

最初に、次の要素を使用して、データベーススキーマと、マッピングの対象となるコンテナ管理による持続性 Bean を指定する必要があります。

sun-cmp-mappings

EJB JAR コレクションにマップされるすべての Beans の、サブ要素のコレクションを指定します。

サブ要素は sun-cmp-mapping です。

「スキーマ定義の例」を参照してください。

sun-cmp-mapping

特定のスキーマにマップする Bean を指定します。

サブ要素は schemaentity-mapping です。

schema

スキーマファイルへのパスを指定します。必要な指定は 1 つだけです。詳細については、「EJB QL クエリの例」および「スキーマの取り込み」を参照してください。

<schema>RosterSchema</schema>

entity-mapping

データベースカラムへの Beans のマッピングを指定します。

サブ要素は ejb-nametable-namecmp-field-mappingcmr-field-mappingsecondary-tableconsistency です。

「entity-mapping」を参照してください。

マッピングコンポーネントの指定

次の要素を使用して、マッピングの一部となるコンポーネントを指定し、整合性検査の動作を指定します。

entity-mapping

データベースカラムへの Beans のマッピングを指定します。

サブ要素は ejb-nametable-namecmp-field-mappingcmr-field-mappingsecondary-tableconsistency です。

<entity-mapping>
   <ejb-name>Player</ejb-name>
   <table-name>PLAYER</table-name>
   <cmp-field-mapping>
       <field-name>salary</field-name>
       <column-name>PLAYER.SALARY</column-name>
   </cmp-field-mapping>
   <cmp-field-mapping>
       <field-name>playerId</field-name>
       <column-name>PLAYER.PLAYER_ID</column-name>
   </cmp-field-mapping>
   <cmp-field-mapping>
       <field-name>position</field-name>
       <column-name>PLAYER.POSITION</column-name>
   </cmp-field-mapping>
       <field-name>name</field-name>
       <column-name>PLAYER.NAME</column-name>
   </cmp-field-mapping>
   <cmr-field-mapping>
       <cmr-field-name>teamId</cmr-field-name>
       <column-pair>
          <column-name>PLAYER.PLAYER_ID</column-name>
          <column-name>TEAMPLAYER.PLAYER_ID</column-name>
       </column-pair>
       <column-pair>
          <column-name>TEAMPLAYER.TEAM_ID</column-name>
          <column-name>TEAM.TEAM_ID</column-name>
       </column-pair>
   </cmr-field-mapping>
</entity-mapping>

ejb-name

ejb-jar.xml ファイルで、コンテナ管理による持続性 Beans が関係するエンティティ Bean の名前を指定します。必要な指定は 1 つだけです。

<ejb-name>Player</ejb-name>

table-name

データベースの表の名前を指定します。この表はデータベーススキーマファイル内に存在している必要があります。必要な指定は 1 つだけです。

<table-name>PLAYER</table-name>

secondary-table

Bean の二次表を指定します。この指定は省略可能です。

サブ要素は table-namecolumn-pair です。

この二次表の例は、StudentEjb クラスに電子メールのフィールドを追加しています。

public abstract class StudentEJB implements EntityBean {

   /***************************************************
   Write ur set,get methods for Entity bean variables and
   business methods here
   ***************************************************/
   //Access methods for CMP fields
   public abstract Integer getStudentId();
   public abstract void setStudentId(Integer studentId);
   public abstract String getStudentName();
   public abstract void setStudentName(String studentName);

   public abstract void setEmail(String Email); <-----二次表
                                               からのカラム

外部キーを使って Student と Email 表を関連づける必要があります。Email 表のスキーマは、次の例のようになります。

Table Email:
------------
Student_id Number
email varchar

Table Student:
--------------
StudentId Number
StudentName varchar
deptId Number
AddressId Number
AccountId Varchar

二次表を追加すると、両方の表が同じ Enterprise JavaBean に適用されます。

consistency

Bean 内のデータに関するトランザクションの整合性を保証する際のコンテナの動作を指定します。この指定は省略可能です。整合性検査フラグ要素が存在しない場合は、none とみなされます。

次の表は、整合性検査で使用する要素を示します。

   整合性フラグ

フラグ要素

説明

check-all-at-commit

 

Sun ONE Application Server 7 では、このフラグは実装されない

 

check-modified-at-commit

 

コミット時に、変更されたインスタンスがあるかどうかをチェックする

 

lock-when-loaded

 

データの読み込み時にロックを実装する

 

lock-when-modified

 

Sun ONE Application Server 7 では、このフラグは実装されない

 

none

 

整合性検査は行われない

 

フィールドマッピングの指定

フィールドマッピングには、次の要素を使用します。

cmp-field-mapping

cmp-field-mapping 要素は、1 つのフィールドを、マッピング先の 1 つまたは複数のカラムに関連付けます。Bean の主表のカラム、または定義された二次表のカラムのどちらでも構いません。フィールドを複数のカラムにマップした場合、データベースから値を取得するときは、最初のカラムが SOURCE として使用されます。カラムは表示される順に更新されます。EJB JAR ファイルに定義された cmp-field-mapping 要素ごとに 1 つの cmp-field 要素があります。

フィールドを読み取り専用として指定できます。

サブ要素は field-namecolumn-nameread-only、および fetched-with です。

<cmp-field-mapping>
   <field-name>name</field-name>
   <column-name>LEAGUE.NAME</column-name>
</cmp-field-mapping>

field-name

フィールドの Java 識別子を指定します。この識別子は、マップする field-namecmp-field サブ要素の値と一致している必要があります。1 つ指定する必要があります。

<field-name>name</field-name>

column-name

主表のカラム名、または二次表か関連する表のカラムの表修飾名 (TABLE.COLUMN) を指定します。1 つ以上指定する必要があります。



複数のカラムをマップするときは、任意の JAVA タイプを使用できます。



<column-name>PLAYER.NAME</column-name>

複数の場所に同じ情報が表示される標準化されていない表で使う場合は、更新のたびに情報の同期をとる必要があります。

public abstract class StudentEJB implements EntityBean {
.
.
.

public abstract String getInstallments();

student 表からの 3 つのカラムを、Student Enterprise JavaBean の 1 つの実装カラムにマップできます。

Table student:
.
.
.
installment1 Number
installment2 Number
installment3 Number

データベース内のすべてのカラムに同じ値が書き込まれます。

read-only

read-only フラグは、フィールドが読み取り専用であることを示します。

<read-only>name</read-only>

fetched-with

フィールドおよび関係のフェッチグループ設定を指定します。フィールドは、階層フェッチグループまたは独立フェッチグループに属することができます。この指定は省略可能です。

fetched-with 要素のデフォルト値は、コンテキストによって異なります。

  • cmp-field-mapping のサブ要素 fetched-with が含まれない場合は、デフォルト値は次のようになります。
  •    <fetched-with><level>0</level></fetched-with>

  • cmr-field-mapping のサブ要素 fetched-with が含まれない場合は、デフォルト値は次のようになります。
  •    <fetched-with><none/></fetched-with>

サブ要素は levelnamed-group、または none です。

level

階層フェッチグループの名前を指定します。値は整数にする必要があります。等しい (または小さい) 値の階層フェッチグループに属するフィールドおよび関係が同時にフェッチされます。level の値は 0 よりも大きくする必要があります。1 つだけ指定できます。

named-group

独立フェッチグループの名前を指定します。指定したグループに属するすべてのフィールドおよび関係が同時にフェッチされます。1 つだけ指定できます。

none

持続性レベルのフラグで、このフィールドまたは関係が、それ自体によってフェッチされているかを示します。

関係の指定

コンテナ管理される関係のマッピングの指定には、次の要素を使用します。

cmr-field-mapping

コンテナ管理関係フィールドには、関係を定義する名前および 1 組以上のカラムペアがあります。cmr-field ごとに 1 つの cmr-field-mapping 要素があります。関係をフェッチグループに入れることもできます。

サブ要素は cmr-field-namecolumn-pairfetched-with です。

<cmr-field-mapping>
   <cmr-field-name>teamId</cmr-field-name>
   <column-pair>
       <column-name>PLAYER.PLAYER_ID</column-name>
       <column-name>TEAMPLAYER.PLAYER_ID</column-name>
   </column-pair>
   <column-pair>
       <column-name>TEAM.TEAM_ID</column-name>
       <column-name>TEAMPLAYER.TEAM_ID</column-name>
   </column-pair>
   <fetched-with>
       <none/>
   </fetched-with>
</cmr-field-mapping>

cmr-field-name

フィールドの Java 識別子を指定します。この識別子は、マップする cmr-fieldcmr-field-name サブ要素の値と一致している必要があります。1 つ指定する必要があります。

<cmr-field-name>team</cmr-field-name>

column-pair

2 つのデータベースの表内の関連カラムのペアの名前を指定します。1 つ以上指定する必要があります。

カラム名は column-name 要素に指定されます。

<column-pair>
   <column-name>PLAYER.PLAYER_ID</column-name>
   <column-name>TEAMPLAYER.PLAYER_ID</column-name>
</column-pair>

column-name

主表のカラム名、または二次表か関連する表のカラムの表修飾名 (TABLE.COLUMN) を指定します。column-pair のサブ要素として 2 つ指定する必要があります。

<column-name>PLAYER.NAME</column-name>

fetched-with

フィールドおよび関係のフェッチグループ設定を指定します。フィールドは、階層フェッチグループまたは独立フェッチグループに属することができます。この指定は省略可能です。

fetched-with 要素のデフォルト値は、コンテキストによって異なります。

  • cmp-field-mapping のサブ要素 fetched-with が含まれない場合は、デフォルト値は次のようになります。
  •    <fetched-with><level>0</level></fetched-with>

  • cmr-field-mapping のサブ要素 fetched-with が含まれない場合は、デフォルト値は次のようになります。
  •    <fetched-with><none/></fetched-with>

サブ要素は levelnamed-group、または none です。

リソースマネージャの設定

コンテナ管理による持続性実装で使用されるリソースマネージャは PersistenceManagerFactory です。これは、Sun ONE Application Server の DTD ファイル sun-server_7_0-0.dtd を使用して設定します。

新しい持続性マネージャの作成については、『Sun ONE Application Server 管理者ガイド』を参照してください。

コンテナ管理による持続性 Beans を含む EJB モジュールを配備するときは、sun-ejb-jar.xml 配備記述子に次の情報を追加する必要があります。

  1. 配備に使用する持続性マネージャを指定します。
  2. <pm-descriptors>
       <pm-descriptor>
           <pm-identifier>SunONE</pm-identifier>
           <pm-version>1.0</pm-version>
    <pm-class-generator>com.iplanet.ias.persistence.internal.ejb.ejbc.J DOCodeGenerator
    </pm-class-generator>
           <pm-mapping-factory>com.iplanet.ias.cmp.
              NullFactory</pm-mapping-factory>
       </pm-descriptor
       <pm-inuse>
           <pm-identifier>SunONE</pm-identifier>
           <pm-version>1.0</pm-version>
       </pm-inuse>
    </pm-descriptors>

  3. 持続性マネージャのリソースの JNDI 名 (server.xml ファイルの persistence-manager-factory-resource に表示される) と、cmp-resource の JNDI 名を指定します。この名前は、持続性リソースの管理時に使われます。

たとえば、server.xml ファイルに次のような記述があるとします。

<persistence-manager-factory-resource
   factory-class="com.sun.jdo.spi.persistence.support.
       sqlstore.impl.PersistenceMan
   gerFactoryImpl"
   enabled="true"
   jndi-name="jdo/pmf"
   jdbc-resource-jndi-name="jdo/pmfPM"
</persistence-manager-factory-resource>

CMP リソースを次のように設定します。

<cmp-resource>
   <jndi-name>jdo/pmf</jndi-name
</cmp-resource>



Sun ONE Studio IDE は、配備用にこの記述子の一部に pm-descriptors を自動的に生成します。コンテナ管理による持続性のリソースを設定する方法については、Sun ONE Studio 4 のオンラインヘルプで「Sun ONE Application Server Integration Module」を参照してください。



EJB QL の使用

Enterprise JavaBeans Specification, v2.0 には、新しいクエリ言語 (EJB QL) が規定されています。この言語は、CMP Beans の移植可能な検索クエリ、および select メソッドの定義に使用されます。このクエリは、SQL に似た構文を使い、抽象スキーマのタイプと CMP Beans の関係に基づいて、エンティティオブジェクトまたはフィールドの値を選択します。

検索メソッドは、Bean のホームインタフェース、ローカルホームインタフェース、またはその両方に定義され、同じ Bean のインスタンスを返します。select メソッドは、抽象 Bean クラスだけに定義され、ローカルタイプまたはリモートタイプのエンティティオブジェクト、および同じスキーマの Beans のフィールド値の選択に使用されます。

詳細については、『Enterprise JavaBeans Specification, v2.0』の第 11 章「EJB QL: EJB Query Language for Container-Managed Persistence Query Methods」を参照してください。

「EJB QL クエリの例」では、EJB QL で記述されたサンプルクエリを紹介します。

1.1 検索のクエリの設定

Enterprise JavaBeans Specification, v1.1 には、検索メソッドの記述形式が規定されていません。Sun ONE Application Server では、検索メソッドとセレクタメソッドの実装に JDOQL (Java Data Objects Query Language) クエリを使います。EJB 2.0 では、コンテナが EJB QL クエリを自動的に JDOQL にマップします。EJB 1.1 では、このマッピングの一部を開発者が行います。基本となる JDOQL クエリの次の要素を指定できます。

  • フィルタ式 - クエリによって返される各オブジェクトに適用される条件を指定する Java ライクな表現。EJB QL の WHERE 句に対応する
  • クエリパラメータ宣言 - クエリの 1 つまたは複数の入力パラメータの名前とタイプを指定する。Java 言語の正式なパラメータの構文で記述する
  • クエリ変数宣言 - 1 つまたは複数のクエリ変数の名前とタイプを指定する。Java 言語のローカル変数の構文で記述する。クエリ変数は、結合を実装するためのフィルタで使用されることがある

Sun ONE Application Server 固有の配備記述子 (sun-ejb-jar.xml) には、EJB 1.1 検索の設定を格納するために、次の要素が用意されています。

query-filter
query-params
query-variables

Sun ONE Application Server は、EJB 1.1 エンティティ Bean の持続性に対応したクラスを候補クラスとして使用し、JDOQL クエリを構築します。フィルタ、パラメータ宣言、および変数宣言は、開発者が指定したとおりに JDOQL クエリに追加されます。クエリが実行され、検索メソッドのパラメータが execute 呼び出しに渡されます。JDOQL クエリの結果セットからのオブジェクトは主キーインスタンスに変換され、EJB 1.1 ejbFind メソッドによって返されます。

JDOQL の詳細は、JDO 仕様書 (JSR 12 を参照) に規定されています。次に、EJB 1.1 検索の定義に必要な要素についてまとめます。

クエリのフィルタ式

フィルタ式は、候補クラスのインスタンスごとに評価されるブール式を含んだ文字列です。フィルタを指定しない場合は、デフォルト値は true となります。式を作成するときは Java 言語のように記述しますが、次の点が異なります。

  • ラッパークラスのプリミティブとインスタンスの等価性と順序の比較が有効である
  • Date フィールドと Date パラメータの等価性と順序の比較が有効である
  • String フィールドと String パラメータの等価性と順序の比較が有効である
  • 空白 (印字されない文字スペース、タブ、改行文字) は区切り文字として認識され、それ以外の用途として認識されない
  • 次の割り当て演算子はサポートされない
    • =、+=、など
    • 前置インクリメントと後置インクリメント
    • 前置デクリメントと後置デクリメント

  • オブジェクトの構築を含め、メソッドはサポートされない。ただし、次のメソッドはサポートされる
  • Collection.contains(Object o)
    Collection.isEmpty()
    String.startsWith(String s)
    String.endsWith(String e)

    さらに、Sun ONE Application Server は次の標準外 JDOQL メソッドをサポートする

    String.like(String pattern)
    String.like(String pattern, char escape)
    String.substring(int start, int length)
    String.indexOf(String str), String.indexOf(String str, int start)
    String.length()
    Math.abs(numeric n), and Math.sqrt(double d)

  • null 値のフィールドは、サブ式が false を返したのと同様に扱われ、NullPointerException がスローされる


  • 浮動小数点値の比較は、もともと不正確です。このため、浮動小数点値の等価性の比較 (== および !=) には注意が必要です。式に含まれる識別子は、候補クラスの名前スペースに含まれているものとみなされ、宣言したパラメータと変数が追加されたものとして解釈されます。Java 言語では、これは予約語であり、現在評価しているインスタンスを意味します。



次の表現はサポートされています。

  • Java 言語で定義され、すべてのタイプに適用される演算子
    • 関係演算子 (==、!=、>、<、>=、<=)
    • ブール演算子 (&、&&、|、||、~、!)
    • 算術演算子 (+、-、*、/)

    文字列の連結は、「文字列 + 文字列」だけがサポートされる

  • 演算子の適用優先度を明示的に決定するカッコ
  • キャスト演算子
  • 比較演算と算術演算での数値オペランドの昇格。昇格の規則は Java の規則と同様である (Java 言語仕様の数値昇格を参照)。BigDecimal、BigInteger、および数値ラッパークラスによって拡張される

クエリのパラメータ

パラメータ宣言は、1 つのパラメータ宣言または複数の宣言をカンマで区切った文字列です。メソッドシグネチャは、Java の構文に準拠します。

クエリ変数

タイプの宣言は、Java のローカル変数宣言の構文に準拠します。

例 1

次のクエリは、Michael という名前のすべての選手を返します。次の文字列リテラルを使って、name フィールドを比較するフィルタが定義されます。

"name == ¥"Michael¥""

sun-ejb-jar.xml ファイルの finder 要素は、次のように記述されます。

<finder>
   <method-name>findPlayerByName</method-name>
   <query-filter>name == "Michael"</query-filter>
</finder>

例 2

このクエリは、指定した価格帯に含まれるすべての製品を返します。価格の上限と下限を指定する 2 つのクエリパラメータ double low および double high が定義されます。フィルタは、クエリパラメータと次の price フィールドを比較します。

"low < price && price < high"

sun-ejb-jar.xml ファイルの finder 要素は、次のように記述されます。

<finder>
   <method-name>findInRange</method-name>
   <query-params>double low, double high</query-params>
   <query-filter>low &lt; price &amp;&amp; price &lt
   high</query-filter
</finder>

例 3

このクエリは、名前を指定した選手より年俸が高額なすべての選手を返します。java.lang.String name という名前を検索するクエリパラメータが定義されます。さらに、比較対象となる選手の変数が定義されます。この変数のタイプは、次の Bean に対応する持続性対応クラスのタイプとなります。

   mypackage.PlayerEJB_170160966_JDOState p

フィルタは、このキーワードによって特定される選手の年俸と、名前で指定した選手の年俸を比較します。

   (this.salary > p.salary) && (p.name == name)

sun-ejb-jar.xml ファイルの finder 要素は、次のように記述されます。

<finder>
   <method-name>findByHigherSalary</method-name>
   <query-params>java.lang.String name</query-params>
   <query-filter>
       (this.salary &gt; p.salary) &amp;&amp;
       (p.name ==name)
   </query-filter>
   <query-variables></query-variables
</finder>

サードパーティ製のプラグイン可能な持続性管理 API

EJB コンテナ内のコンテナ管理による持続性では、Sun ONE Application Server Pluggable Persistence Manager API を使用して、持続性ベンダーのランタイムを Sun ONE Application Server に統合できます。この API には、配備時、コード生成時、および実行時の統合要件が記述されています。EJB のコンパイル時に、具体的な Bean の実装を実現するためのコールアウトをサポートしています。

Sun ONE Application Server では、コンテナ管理による持続性の実装により、その起動フレームワークを使用して、クラスの読み込みおよび持続性マネージャの登録を行うことができます。Pluggable Persistence Manager API は、トランザクションおよび動的配備に関する統合要件もサポートしています。

一般に、サードパーティのコンテナ管理による持続性ソリューションで『Enterprise JavaBeans Specification, v2.0』に対応するものはすべて、Sun ONE Application Server で動作させることができます。

サードパーティツールを使用するには、次のようにします。

  1. サードパーティ O/R マッピングツールを使用して、Enterprise JavaBeans を作成します。
  2. Assembly Tool またはコマンド行インタフェースを使って、その Beans を配備します。

サードパーティの持続性ツールでは、実行時に JDBC (Java Database Connectivity) リソースまたは JCA (Java Connector API) リソースを使って、リレーショナルデータソースにアクセスする必要があります。このため、プラグイン可能な持続性マネージャでは、コネクションのプール、トランザクション処理、およびコンテナのセキュリティ管理機能を自動的に使用できます。サードパーティベンダーは、それぞれの具象クラスジェネレータおよびマッピングファクトリをプラグインして、ベンダー固有の有効なマッピングオブジェクトモデルを生成できます。

設定要件では、Bean に対して定義する必要がある次のプロパティを指定します。

  • 持続性メカニズム
  • 持続性のベンダーとバージョン
  • 持続性メカニズムで必要な追加情報

制限事項と最適化

この節では、エンティティ Beans のコンテナ管理による持続性を実装するときに、留意する制限事項およびパフォーマンスの最適化について説明します。

EAR ファイル内の一意のデータベーススキーマ名

1 つの EAR ファイル内に複数の JAR ファイルがある場合、たとえば jar1jar2 がある場合は、jar1jar2 に対応するデータベーススキーマファイルは、一意の完全修飾名を持つ必要があります。

つまり、データベーススキーマファイル名は、EAR ファイル内で一意にする必要があります。

コンテナ管理による持続性のプロトコルに関する制限事項

  • データエイリアスの問題 - 複数のエンティティ Beans のコンテナ管理フィールドを、基礎となっているデータベース内の同じデータ項目にマップすると、同じトランザクション内で複数の Beans が呼び出された場合に、エンティティ Beans のデータビューが正しく表示されないことがある
  • 過剰な状態読み込み - コンテナは、抽象 Bean の ejbLoad メソッドを起動する前に、エンティティオブジェクト全体の状態をコンテナ管理フィールドに読み込みむ。このため、大きい状態を持つエンティティオブジェクトの場合、ほとんどのビジネスメソッドが状態の一部にしかアクセスする必要がないときは、最大限の性能が得られない可能性がある。これが問題となるときは、あまり使用されないフィールドの <fetched-with> 要素を使用する

リモートインタフェースに関する制限事項

コンテナ管理による持続性を使用するエンティティ Bean のリモートインタフェースには、次の制限事項があります。

  • コンテナ管理関係で使用されるコンテナ管理関係フィールドまたは持続性コレクションクラスでは、Bean のリモートインタフェースを介して get メソッドおよび set メソッドを表示することはできない
  • ただし、エンティティ Bean のコンテナ管理持続性フィールドに対応する get メソッドおよび set メソッドは、Bean のリモートインタフェースから表示できる

  • ローカルインタフェースタイプまたはローカルホームインタフェースタイプを、Bean のリモートインタフェースまたはリモートホームインタフェースから表示することはできない
  • 関係で使用されるコンテナ管理コレクションクラスを、Bean のリモートインタフェースから表示することはできない

従属値クラスは、リモートインタフェースまたはリモートホームインタフェースで表示可能であり、クライアントの EJB JAR ファイルに格納できます。

sun-cmp-mappings.xml ファイルの要素

「Enterprise JavaBean のアセンブルと配備」で、配備用 Enterprise JavaBeans のアセンブルに関する情報およびガイドラインを提供しています。配備に関する詳細情報および手順は、『Sun ONE Application Server 開発者ガイド』を参照してください。

sun-ejb-jar.xml ファイルに含まれる持続性関連要素については、「持続性要素」を参照してください。

サンプルの XML ファイルについては、「スキーマ定義の例」を参照してください。

この節では、sun-cmp-mappings.xml ファイル内の次の要素について説明します。

check-all-at-commit

Sun ONE Application Server 7 では、このフラグは実装されません。

サブ要素

なし

check-modified-at-commit

コミット時に、変更された Bean インスタンスがあるかどうかをチェックするように指示する整合性レベルフラグです。

サブ要素

なし

cmp-field-mapping

cmp-field-mapping 要素は、1 つのフィールドを、マッピング先の 1 つまたは複数のカラムに関連付けます。Bean の主表のカラム、または定義された二次表のカラムのどちらでも構いません。フィールドを複数のカラムにマップした場合、データベースから値を取得するときは、最初のカラムが SOURCE として使用されます。カラムは表示される順に更新されます。EJB JAR ファイルに定義された cmp-field-mapping 要素ごとに 1 つの cmp-field 要素があります。

フィールドを読み取り専用として指定できます。

fetched-with 要素が指定されていない場合は、フィールドはフェッチグループに属することができます。次のようにみなされます。

<fetched-with><level>0</level></fetched-with>

サブ要素

次の表は、cmp-field-mapping 要素のサブ要素を示します。

   cmp-field-mapping のサブ要素 

サブ要素

必要指定数

説明

field-name

 

1 個のみ

 

フィールドの Java 識別子を指定する。この識別子は、マップする cmp-fieldfield-name サブ要素の値と一致している必要がある。1 つ指定する必要がある

 

column-name

 

1 個以上

 

主表のカラム名、または二次表か関連表のカラムの表修飾名 (TABLE.COLUMN) を指定する1 つ指定する必要がある

 

read-only

 

0 または 1 個

 

フィールドが読み取り専用であることを示すフラグ。この指定は省略可能

 

fetched-with

 

0 または 1 個

 

フィールドおよび関係のフェッチグループ設定を指定する。この指定省略可能

 

cmr-field-mapping

コンテナ管理関係フィールドは、関係を定義する名前および 1 組以上のカラムペアを持ちます。cmr-field ごとに 1 つの cmr-field-mapping 要素があります。関係をフェッチグループに入れることもできます。

fetched-with 要素が存在しない場合は、次の値が適用されます。<fetched-with><none/></fetched-with>.

サブ要素

次の表は、cmr-field-mapping 要素のサブ要素を示します。

   cmr-field-mapping のサブ要素 

サブ要素

必要指定数

説明

cmr-field-name

 

1 個のみ

 

フィールドの Java 識別子を指定する。マップする cmr-fieldcmr-field-name サブ要素の値と一致している必要がある

 

column-pair

 

1 個以上

 

データベースの表内のカラムのペアの名前を指定する

 

fetched-with

 

0 または 1 個

 

フィールドおよび関係のフェッチグループ設定を指定する。この指定は省略可能

 

cmr-field-name

フィールドの Java 識別子を指定します。マップする cmr-fieldcmr-field-name サブ要素の値と一致している必要があります。

サブ要素

なし

column-name

主表のカラム名、または二次表か関連表のカラムの表修飾名 (TABLE.COLUMN) を指定します。1 つ指定する必要があります。

サブ要素

なし

column-pair

2 つのデータベースの表内の関連カラムのペアの名前を指定します。1 つ指定する必要があります。

サブ要素

次の表は、column-pair 要素のサブ要素を示します。

   column-pair のサブ要素 

サブ要素

必要指定数

説明

column-name

 

2 個

 

主表のカラム名、または二次表か関連表のカラムの表修飾名 (TABLE.COLUMN) を指定する

 

consistency

Bean 内のデータに関するトランザクションの整合性を保証する際のコンテナの動作を指定します。この指定は省略可能です。整合性検査フラグ要素が存在しない場合は、none とみなされます。

サブ要素

次の表は、整合性検査で使用する要素を示します。

   整合性フラグ

フラグ要素

説明

check-all-at-commit

 

コミット時に、変更されたインスタンスがあるかどうかをチェックする

 

check-modified-at-commit

 

Sun ONE Application Server 7 では、このフラグは実装されない

 

lock-when-loaded

 

データの読み込み時に排他的なロックを取得する

 

lock-when-modified

 

Sun ONE Application Server 7 では、このフラグは実装されない

 

none

 

整合性検査は行われない

 

ejb-name

ejb-jar.xml ファイルで、コンテナ管理による持続性 Beans が関係するエンティティ Bean の名前を指定します。1 つ指定する必要があります。

サブ要素

なし

entity-mapping

データベースカラムへの Bean のマッピングを指定します。

サブ要素

次の表は、entity-mapping 要素のサブ要素を示します。

   entity-mapping のサブ要素 

サブ要素

必要指定数

説明

ejb-name

 

1 個のみ

 

ejb-jar.xml ファイルで、コンテナ管理による持続性 Beans が関係するエンティティ Bean の名前を指定する。1 つ指定する必要がある

 

table-name

 

1 個のみ

 

データベースの表の名前を指定する。この表はデータベーススキーマファイル内に存在している必要がある

 

cmp-field-mapping

 

1 個以上

 

1 つのフィールドを、マッピング先の 1 つまたは複数のカラムに関連付ける。Bean の主表のカラム、または定義された二次表のカラムのどちらでも構わない。フィールドを複数のカラムにマップした場合、データベースから値を取得するときは、最初のカラムが SOURCE として使用される。カラムは表示される順に更新される。EJB JAR ファイルに定義された cmp-field-mapping 要素ごとに 1 つの cmp-field 要素がある。

フィールドを読み取り専用として指定できる

 

cmr-field-mapping

 

0 または 1 個以上

 

コンテナ管理関係フィールドは、関係を定義する名前および 1 組以上のカラムペアを持つ。cmr-field ごとに 1 つの cmr-field-mapping 要素がある。関係をフェッチグループに入れることもできる

 

secondary-table

 

0 または 1 個以上

 

Bean の主表と二次表の関係を示す。この関係を示すには、カラムのペアを使用する

 

consistency

 

0 または 1 個

 

Bean 内のデータに関するトランザクションの整合性を保証する際のコンテナの動作を指定する。整合性検査フラグ要素が存在しない場合は、none とみなされる

 

fetched-with

フィールドおよび関係のフェッチグループ設定を指定します。この指定は省略可能です。

フィールドは、階層フェッチグループまたは独立フェッチグループに属することができます。fetched-with 要素が存在しない場合は、次の値が適用されます。<fetched-with><none/></fetched-with>.

サブ要素

次の表は、fetched-with 要素のサブ要素を示します。

   fetched-with のサブ要素 

サブ要素

必要指定数

説明

level

 

この表の要素のいずれか 1 つだけ

階層フェッチグループの名前を指定する。値は整数にする必要がある。等しい (または小さい) 値の階層フェッチグループに属するフィールドおよび関係が同時にフェッチされる。level の値は 0 よりも大きくする必要がある

 

named-group

 

独立フェッチグループの名前を指定する。指定したグループに属するすべてのフィールドおよび関係が同時にフェッチされる

 

none

 

整合性レベルのフラグで、このフィールドまたは関係が、それ自体によってフェッチされているかを示す

 

field-name

フィールドの Java 識別子を指定します。この識別子は、マップする cmp-fieldfield-name サブ要素の値と一致している必要があります。1 つ指定する必要があります。

サブ要素

なし

level

階層フェッチグループを指定します。この要素の値は整数にする必要があります。等しい (または小さい) 値の階層フェッチグループに属するフィールドおよび関係が同時にフェッチされます。level の値は 0 よりも大きくする必要があります。1 つだけ指定できます。

サブ要素

なし

lock-when-loaded

データの読み込み時にロックを実装するように指示する整合性レベルフラグです。

サブ要素

なし

lock-when-modified

Sun ONE Application Server 7 では、このフラグは実装されません。

サブ要素

なし

named-group

独立フェッチグループの名前を指定します。指定したグループに属するすべてのフィールドおよび関係が同時にフェッチされます。1 つだけ指定できます。

サブ要素

なし

none

このフィールドまたは関係がほかのフィールドまたは関係と一緒にフェッチされないように指示する、または fetched-with セマンティックを指定する整合性レベルフラグです。

サブ要素

なし

read-only

フィールドが読み取り専用であることを示すフラグです。

サブ要素

なし

schema

スキーマファイルへのパスを指定します。1 つだけ指定する必要があります。詳細は、「スキーマの取り込み」を参照してください。

サブ要素

なし

secondary-table

Bean の二次表を指定します。

サブ要素

次の表は、secondary-table 要素のサブ要素を示します。

   secondary table のサブ要素 

サブ要素

必要指定数

説明

table-name

 

1 個のみ

 

データベースの表の名前を指定する。この表はデータベーススキーマファイル内に存在している必要がある

 

column-pair

 

1 個以上

 

2 つのデータベースの表内の関連カラムのペアの名前を指定する

 

sun-cmp-mapping

特定のスキーマにマップする Bean を指定します。



同じ EJB JAR ファイル内に配備する Beans 間であっても、Bean を別のスキーマにマップする Bean に関連付けることはできません。



サブ要素

次の表は、sun-cmp-mapping 要素のサブ要素を示します。

   sun-cmp-mapping のサブ要素 

サブ要素

必要指定数

説明

schema

 

1 個のみ

 

スキーマファイルへのパスを指定する

 

entity-mapping

 

1 個以上

 

データベースカラムへの Beans のマッピングを指定する

 

sun-cmp-mappings

EJB JAR コレクションにマップされるすべての Beans の、サブ要素のコレクションを指定します。

サブ要素

次の表は、sun-cmp-mappings 要素のサブ要素を示します。

   sun-cmp-mappings のサブ要素 

サブ要素

必要指定数

説明

sun-cmp-mapping

 

1 個以上

 

特定のスキーマにマップする Bean を指定する

 

table-name

データベースの表の名前を指定する。この表はデータベーススキーマファイル内に存在している必要がある。1 つ指定する必要がある

サブ要素

なし


この節では、次の例を紹介します。

スキーマ定義の例

CREATE TABLE Player
(
   player_Id VARCHAR(255) PRIMARY KEY,
   name VARCHAR(255) ,
   position VARCHAR(255) ,
   salary DOUBLE PRECISION NOT NULL ,
   picture BLOB,
);

CREATE TABLE League
(
   league_Id VARCHAR(255) PRIMARY KEY,
   name VARCHAR(255) ,
   sport VARCHAR(255) ,
);

CREATE TABLE Team
(
   team_Id VARCHAR(255) PRIMARY KEY,
   city VARCHAR(255) ,
   name VARCHAR(255) ,
   league_Id VARCHAR(255) ,
   FOREIGN KEY (league_Id)   REFERENCES League (league_Id) ,
);

CREATE TABLE TeamPlayer
(
   player_Id VARCHAR(255) ,
   team_Id VARCHAR(255),
   CONSTRAINT pk_TeamPlayer PRIMARY KEY (player_Id , team_Id) ,
   FOREIGN KEY (team_Id)   REFERENCES Team (team_Id),
   FOREIGN KEY (player_Id)   REFERENCES Player (player_Id) ,
);

CMP マッピング XML ファイルの例

これらの要素に関する詳細は、「sun-cmp-mappings.xml ファイルの要素」を参照してください。

次のマッピングファイル例は、配備可能な EJB JAR ファイル内で META-INF/sun-cmp-mappings.xml という名前を持ちます。

<?xml version="1.0" encoding="UTF-8"?>
<sun-cmp-mappings>
   <sun-cmp-mapping>
       <schema>RosterSchema</schema>
       <entity-mapping>
          <ejb-name>League</ejb-name>
          <table-name>LEAGUE</table-name>
          <cmp-field-mapping>
             <field-name>name</field-name>
             <column-name>LEAGUE.NAME</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>leagueId</field-name>
             <column-name>LEAGUE.LEAGUE_ID</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>sport</field-name>
             <column-name>LEAGUE.SPORT</column-name>
          </cmp-field-mapping>
          <cmr-field-mapping>
             <cmr-field-name>team</cmr-field-name>
             <column-pair>
                 <column-name>LEAGUE.LEAGUE_ID</column-name>
                 <column-name>TEAM.LEAGUE_ID</column-name>
             </column-pair>
          </cmr-field-mapping>
       </entity-mapping>
       <entity-mapping>
          <ejb-name>Team</ejb-name>
          <table-name>TEAM</table-name>
          <cmp-field-mapping>
             <field-name>name</field-name>
             <column-name>TEAM.NAME</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>city</field-name>
             <column-name>TEAM.CITY</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>teamId</field-name>
             <column-name>TEAM.TEAM_ID</column-name>
          </cmp-field-mapping>
          <cmr-field-mapping>
             <cmr-field-name>playerId</cmr-field-name>
                 <column-pair>
                 <column-name>TEAM.TEAM_ID</column-name>
                 <column-name>TEAMPLAYER.TEAM_ID</column-name>
             </column-pair>
             <column-pair>
                 <column-name>TEAMPLAYER.PLAYER_ID</column-name>
                 <column-name>PLAYER.PLAYER_ID</column-name>
             </column-pair>
             <fetched-with>
                 <none/>
             </fetched-with>
          </cmr-field-mapping>
          <cmr-field-mapping>
             <cmr-field-name>leagueId</cmr-field-name>
             <column-pair>
                 <column-name>TEAM.LEAGUE_ID</column-name>
                 <column-name>LEAGUE.LEAGUE_ID</column-name>
             </column-pair>
             <fetched-with>
                 <none/>
             </fetched-with>
          </cmr-field-mapping>
       </entity-mapping>

       <entity-mapping>
          <ejb-name>Player</ejb-name>
          <table-name>PLAYER</table-name>
          <cmp-field-mapping>
             <field-name>salary</field-name>
             <column-name>PLAYER.SALARY</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>playerId</field-name>
             <column-name>PLAYER.PLAYER_ID</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>position</field-name>
             <column-name>PLAYER.POSITION</column-name>
          </cmp-field-mapping>
          <cmp-field-mapping>
             <field-name>name</field-name>
             <column-name>PLAYER.NAME</column-name>
          </cmp-field-mapping>
          <cmr-field-mapping>
             <cmr-field-name>teamId</cmr-field-name>
             <column-pair>
                 <column-name>PLAYER.PLAYER_ID</column-name>
                 <column-name>TEAMPLAYER.PLAYER_ID</column-name>
             </column-pair>
             <column-pair>
                 <column-name>TEAMPLAYER.TEAM_ID</column-name>
                 <column-name>TEAM.TEAM_ID</column-name>
             </column-pair>
          </cmr-field-mapping>
       </entity-mapping>
   </sun-cmp-mapping>
</sun-cmp-mappings>

EJB QL クエリの例

<query>
   <description></description>
   <query-method>
      <method-name>findAll</method-name>
      <method-params />
   </query-method>
   <ejb-ql>select object(l) from League l</ejb-ql>
</query>

<query>
   <description></description>
   <query-method>
      <method-name>findByName</method-name>
      <method-params>
         <method-param>java.lang.String</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select object(l) from League l where l.name = ?1</ejb-ql>
</query>

<query>
   <description></description>
   <query-method>
      <method-name>findByPosition</method-name>
      <method-params>
         <method-param>java.lang.String</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select distinct object(p) from Player p where p.position = ?1</ejb-ql>
</query>

<query>
   <description>Selector returning SET</description>
   <query-method>
      <method-name>ejbSelectTeamsCity</method-name>
      <method-params>
         <method-param>team.LocalLeague</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select distinct t.city from Team t where t.league = ?1</ejb-ql>
</query>

<query>
   <description>Selector returning single object LocalInterface</description>
   <query-method>
      <method-name>ejbSelectTeamByCity</method-name>
      <method-params>
         <method-param>java.lang.String</method-param>
      </method-params>
   </query-method>
   <result-type-mapping>Local</result-type-mapping>
   <ejb-ql>select distinct Object(t) from League l, in(l.teams) as t where t.city = ?1</ejb-ql>
</query>

<query>
   <description>Selector returning single object String</description>
   <query-method>
      <method-name>ejbSelectTeamsNameByCity</method-name>
      <method-params>
         <method-param>java.lang.String</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select distinct t.name from League l, in(l.teams) as t where t.city = ?1</ejb-ql>
</query>

<query>
   <description>Selector returning Set using multiple collection declarations</description>
   <query-method>
      <method-name>ejbSelectPlayersByLeague</method-name>
      <method-params>
         <method-param>team.LocalLeague</method-param>
      </method-params>
   </query-method>
   <result-type-mapping>Local</result-type-mapping>
   <ejb-ql>select Object(p) from League l, in(l.teams) as t, in(t.players) p
where l = ?1</ejb-ql>
</query>

<query>
   <description>Selector single object int</description>
   <query-method>
      <method-name>ejbSelectSalaryOfPlayerInTeam</method-name>
      <method-params>
         <method-param>team.LocalTeam</method-param>
         <method-param>java.lang.String</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select p.salary from Team t, in(t.players) as p where t = ?1 and p.name = ?2</ejb-ql>
</query>

<query>
   <description>Finder using the IN Expression</description>
   <query-method>
      <method-name>findByPositionsGoalkeeperOrDefender</method-name>
      <method-params/>
   </query-method>
   <ejb-ql>select object(p) from Player p where p.position IN ('goalkeeper', 'defender')</ejb-ql>
</query>

<query>
   <description>Finder using the LIKE Expression</description>
   <query-method>
      <method-name>findByNameEndingWithON</method-name>
      <method-params/>
   </query-method>
   <ejb-ql>select object(p) from Player p where p.name LIKE '%on'</ejb-ql>
</query>

<query>
   <description>Finder using the IS NULL Expression</description>
   <query-method>
      <method-name>findByNullName</method-name>
      <method-params/>
   </query-method>
   <ejb-ql>select object(p) from Player p where p.name IS NULL</ejb-ql>
</query>

<query>
   <description>Finder using the MEMBER OF Expression</description>
   <query-method>
      <method-name>findByTeam</method-name>
      <method-params>
         <method-param>team.LocalTeam</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select object(p) from Player p where ?1 MEMBER p.teams</ejb-ql>
</query>

<query>
   <description>Finder using the ABS function</description>
   <query-method>
      <method-name>findBySalarayWithArithmeticFunctionABS</method-name>
      <method-params>
         <method-param>double</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select object(p) from Player p where p.salary = ABS(?1)</ejb-ql>
</query>

<query>
   <description>Finder using the SQRT function</description>
   <query-method>
      <method-name>findBySalarayWithArithmeticFunctionSQRT</method-name>
      <method-params>
         <method-param>double</method-param>
      </method-params>
   </query-method>
   <ejb-ql>select object(p) from Player p where p.salary = SQRT(?1)</ejb-ql>
</query>


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