9.6.3 CMP2.xとデータベースのマッピング
CMP2.x Entity Beanのフィールドをデータベース上のテーブルにマッピングします。
また,ここでは,CMPを定義した二つのCMP2.x Entity Beanの間に関連(CMR)を定義する方法についても説明します。
CMP2.xとデータベースのマッピング手順を,次に示します。
-
CMP2.x Entity Bean間にCMRの関係がある場合,CMP2.x Entity Bean間にCMRを定義します。
-
CMP2.x Entity Beanのフィールドをデータベース上のテーブルにマッピングします。
-
CMP2.x Entity Beanに対してcjgencmpsqlコマンドを実行してSQL文を生成します。
(1) CMRの定義
CMPを定義した二つのCMP2.x Entity Beanの間にCMRの関係がある場合,CMP2.x Entity Bean間にCMRを定義します。
(a) 編集する属性ファイル
EJB-JAR属性ファイル
(b) 編集する属性ファイルの取得と属性の設定
-
属性ファイルの取得
次に示すコマンドを実行してEJB-JAR属性ファイルを取得します。
- 実行形式
cjgetappprop [<サーバ名称>] [-nameserver <プロバイダURL>] -name <J2EEアプリケーション名> -type ejb -resname <EJB-JAR表示名> -c <EJB-JAR属性ファイルパス>
- 実行例
cjgetappprop MyServer -name adder -type ejb -resname adder -c C:\home\adder_ejb.xml
-
属性の設定
次に示すコマンドを実行して,EJB-JAR属性ファイルの値を反映します。
- 実行形式
cjsetappprop [<サーバ名称>] [-nameserver <プロバイダURL>] -name <J2EEアプリケーション名> -type ejb -resname <EJB-JAR表示名> -c <EJB-JAR属性ファイルパス>
- 実行例
cjsetappprop MyServer -name adder -type ejb -resname adder -c C:\home\adder_ejb.xml
- 注意事項
-
開始状態のアプリケーションに含まれるEJB-JAR属性ファイルの取得はできますが,定義された関連情報の反映はできません。
(c) 編集する属性設定項目
二つのCMP2.x Entity Bean間の関係を定義する(<relationships> - <ejb-relation>)プロパティ設定項目を次に示します。
項目 |
必須 |
対応するタグ名 |
---|---|---|
説明 |
△ |
<description> |
関連定義名 |
○ |
<ejb-relation-name> |
Enterprise Bean(EJB1)情報 |
○ |
<ejb1> |
Enterprise Bean(EJB2)情報 |
○ |
<ejb2> |
プロパティの設定項目については,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」の「3.3.1 EJB-JAR属性ファイルの指定内容」を参照してください。
Enterprise Bean(EJB1)情報(<ejb1>)とEnterprise Bean(EJB2)情報(<ejb2>)について,それぞれ,設定側のEnterprise Beanと相手側のEnterprise Beanの関連についての項目を指定します。
項目 |
必須 |
対応するタグ名 |
---|---|---|
説明 |
△ |
<description> |
関連のロール名 |
△ |
<ejb-relationship-role-name> |
設定側の多重度 |
○ |
<multiplicity> |
カスケードデリートの設定 |
○ |
<cascade-delete> |
設定側の<ejb-name> |
○ |
<ejb-name> |
CMRフィールドの名称 |
○ |
<cmr-field-name> |
CMRフィールドの型 |
△ |
<cmr-field-type> |
プロパティの設定項目については,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」の「3.3.1 EJB-JAR属性ファイルの指定内容」を参照してください。
(2) CMP2.xとデータベースのマッピング
CMP2.x Entity Beanのフィールドをデータベース上のテーブルにマッピングします。
(a) 編集する属性ファイル
編集する属性ファイルについては,「9.6.2 CMP1.xとデータベースのマッピング」の「(1) 編集する属性ファイル」を参照してください。
(b) 編集する属性ファイルの取得と属性の設定
編集する属性ファイルの所得と属性の設定については,「9.6.2 CMP1.xとデータベースのマッピング」の「(2) 編集する属性ファイルの取得と属性の設定」を参照してください。
(c) 編集する属性設定項目
CMP2.x Entity Beanのフィールドをデータベース上の表にマッピングする(<cmp-map>)プロパティ設定項目を次に示します。
項目 |
必須 |
対応するタグ名 |
---|---|---|
リソースアダプタの表示名 |
○ |
<datasource-name> |
データベースのカタログ名 |
△ |
<catalog-name> |
データベースのスキーマ名 |
△ |
<schema-name> |
データベースのテーブル名 |
○ |
<table-name> |
データベースへの書き込み許可/禁止 |
○ |
<read-only-access> |
トランザクション遮断レベル※1 |
△ |
<transaction-isolation> |
データベース書き込みデータ照合方法 |
△ |
<concurrency-protection> |
フィールドとテーブルのカラムとのマッピング情報※2 |
○ |
<field-impl> |
項目 |
対応するタグ名 |
---|---|
EntityBeanのフィールド名 |
<field-name> |
テーブルのカラム名 |
<column-name> |
プロパティの設定項目については,マニュアル「アプリケーションサーバ リファレンス 定義編(アプリケーション/リソース定義)」の「3.5.1 Entity Bean属性ファイルの指定内容」を参照してください。
(d) 注意事項
-
Entity BeanのCMPフィールドをデータベースの複数の表にマッピングする機能は提供していません。
-
マッピングで利用するDB Connectorの定義で指定されているユーザと,CMPのマッピング先となるデータベースの表の所有者が異なる場合,DB Connectorの定義で指定されているユーザには次に示す権限が必要です。
マッピング時:SELECT
実行時:SELECT,INSERT,UPDATE,DELETE
-
CMPフィールドのマッピングが終わっていない場合,およびアプリケーションが開始状態の場合は,SQLを生成できません。
-
CMRの関係を結ぶ二つのBeanのテーブルは同じデータベース製品のデータベース上になくてはいけません。
(3) SQL文の生成
finder/selectメソッドが実行されたときに使用されるSQL文を生成します。
- CMP2.x Entity Bean間にCMRの関係がない場合
-
定義されたEJB QL(<query>)を基にSQL文を生成します。
- CMP2.x Entity Bean間にCMRの関係がある場合
-
SQL文の生成をする前に,まず,すべてのCMP2.x Entity Beanについてフィールドを表の列にマッピングします。すべてのBeanについてマッピング操作の終了後,すべてのCMP2.x Entity BeanについてSQL文を生成してください。Entity Beanにfinder/selectメソッドがない場合でも同様にSQL文を生成してください。
なお,Entity Bean間にCMRの関係がある場合は,finder/selectメソッドが実行されたときに使用されるSQL文のほかに,CMR用の表を操作するためのSQL文も生成されます。一度SQLを生成したあとにCMRの設定を変更した場合は,開始する前に,変更したCMRに関するEntity BeanについてSQL文を生成してください。CMR用の表の詳細については,「(4) CMR用の表」を参照してください。
次に示すコマンドを実行してSQL文を生成します。
-
J2EEアプリケーションに含まれるすべてのCMP2.x Entity BeanのSQL文を生成する場合
- 実行形式
cjgencmpsql [<サーバ名称>] -name J2EEアプリケーション名
- 実行例
cjgencmpsql MyServer -name App1
-
J2EEアプリケーションに含まれる,特定のCMP2.x Entity BeanのSQL文を生成する場合
- 実行形式
cjgencmpsql [<サーバ名称>] -name J2EEアプリケーション名 -resname <EJB-JARの表示名/Entity Beanの表示名>
- 実行例
cjgencmpsql MyServer -name App1 -resname EjbJar1/Ejb1
cjgencmpsqlコマンドの詳細については,マニュアル「アプリケーションサーバ リファレンス コマンド編」の「cjgencmpsql(CMP2.x Entity Bean用SQL文の生成)」を参照してください。
(4) CMR用の表
ここでは,CMR用の表について説明します。
なお,以降の説明では,EJB-JARの<ejb1> - <ejb-name>で設定されているEntity Beanを「Bean1」,<ejb2> - <ejb-name>で設定されているEntity Beanを「Bean2」と呼びます。
(a) CMR用の表の概要
EJBコンテナでは,CMP2.x Entity Beanの間にCMRの関係があった場合,データベース上に表を作り,CMRの状態の保持のために利用します。
次の図に示すようにCMR用の表には関係を結ぶ二つのEntity Beanのプライマリキーが格納されます。
(b) CMR用の表の生成と削除
CMRを含むアプリケーションを開始すると,CMR用の表が生成されます。生成される場所はBean1の表があるスキーマです。この表はアプリケーションの停止時に削除されます。表の生成,削除,操作のためのSQLは,アプリケーションをカスタマイズするときのデータベースマッピングのあとで生成されたSQLを使用します。
アプリケーションが開始状態のままサーバを停止させた場合はCMR用の表はデータベース上に残ります。また,アプリケーションが開始状態のままサーバが再起動された場合は,CMR用の表がデータベース上にあるかどうかをチェックします。アプリケーションの開始時およびサーバ起動時のCMR用の表生成処理を次の表に示します。
状態 |
作成する表と同名の表がデータベース上にあるかどうか |
同名の表がある場合,列の数,名前,JDBC型が同じかどうか |
動作 |
出力メッセージID |
---|---|---|---|---|
開始時※1 |
なし |
該当しない |
表を生成し,利用します。 |
KDJE43007-I |
あり |
同じまたは同じでない |
開始を中断します。※2 |
KDJE43003-E |
|
J2EEサーバ起動時 |
なし |
該当しない |
開始を中断します。※3 |
KDJE43008-E |
あり |
同じ |
開始時にCMR用として作ったものであると判断し,利用します。 |
KDJE43006-I |
|
同じでない |
開始を中断します。※3 |
KDJE43008-E |
(c) CMR用の表の命名規則
CMR用の表の名前は次のようになります。
-
双方向の関係の場合
[Bean1の<ejb-name>]_[Bean1の<cmr-field-name>]_[Bean2の<ejb-name>]_[Bean2の<cmr-field-name>]
-
単方向の関係の場合(方向はBean1からBean2とします)
[Bean1の<ejb-name>]_[Bean1の<cmr-field-name>]_[Bean2の<ejb-name>]
ただし,この方法で決めた名前が29文字以上になった場合は,28文字になるように切ります。28文字になるように切った名前がデータベース上の既存の表の名前や同じEJB-JAR内のほかのCMR用の表の名前と重なる場合は,0〜99の番号を末尾に付けて区別します。
(d) CMRについての注意事項
-
ユーザはBean1の表があるスキーマで,CREATE TABLEを行う権限が必要です。
-
データベースやOSの種別によってはプライマリキーのサイズの制限で,CMR用の表の生成に失敗することがあります。図9-1に示すように,CMR用の表にはEntity Beanのプライマリキーを格納するので,Entity Beanのプライマリキーのサイズを調整してください。
-
アプリケーションの停止時にCMR用の表は削除されるため,それまでに結んだrelationの情報が失われてしまいます。また,CMR用の表を手動で削除した場合もrelationの情報は失われます。
-
CMR用の表の名前を付ける場合に0〜99の100種類の番号を使い切ったときは,CMR用の表が生成できません。データベース上の不要な表を削除してその名前を使用できるようにするか,または「(c) CMR用の表の命名規則」を参考にして異なる名前を付けられるようにしてください。
-
relationを結ぶEntity Beanのプライマリキーはデータベースの表のプライマリキーにできる型へマッピングしてください。
-
CMRを含むアプリケーションの停止時にCMR用の表は削除されますが,データベースへアクセスできないような障害発生などでCMR用の表の削除に失敗する場合があります。この場合は,表がデータベース上に残るため,不要なときはデータベース製品で提供しているツールを使用して手動で削除してください。
(e) 障害発生時のCMR用の表の回復
CMRを含むアプリケーションが開始され,運用していた状態で保守などのためにJ2EEサーバを停止,起動したときに障害が発生すると,CMRを含むアプリケーションが開始された状態で立ち上がらないことが考えられます。障害を解決し,再度CMRを含むアプリケーションを開始しようとしても,表9-4に示されるように作成する表と同名の表がデータベース上にある場合,開始ができません(アプリケーション間で表の共有を避けるため)。
ここで,SQL生成を再度実行すると,新しいCMR用の表名を使用したSQLが生成され,新しいCMR用の表を使用するように開始ができます。しかし,J2EEサーバを停止する以前に使用していた関係を継続させたい場合,データベースに残っている表を使うように開始する必要があります。
usrconf.propertiesファイルのejbserver.ejb.cmp20.cmr.use.existing_tableキーは,アプリケーションの起動障害発生時,それまで使用していた関係の情報を回復させるためのオプションです。このキーにtrueを指定すると,データベース既存の表を使用するように開始できます。このキーに何も指定しない,またはfalseを指定した場合は,表9-4の動作をします。このオプションを使用して,既存の表を使用する場合の手順を次に示します。
-
障害発生前に使用していたCMR用の表がデータベース上に残っていることを,データベース製品で提供しているツールなどを使用して確認してください。
-
J2EEサーバを停止します(アプリケーションが開始状態で立ち上がることに失敗した原因の対処をしてください)。
-
usrconf.propertiesファイルにejbserver.ejb.cmp20.cmr.use.existing_table=trueを設定します。
-
J2EEサーバを起動します。
-
開始に失敗したCMRを含むアプリケーションを再度開始します。
- 注意事項
-
ここでSQL生成を再実行しないでください。再実行すると新しいテーブル名でSQLが生成され,以前の表が使用できなくなります。
-
J2EEサーバを停止します。
-
usrconf.propertiesファイルにejbserver.ejb.cmp20.cmr.use.existing_table=falseを設定するか,またはこのオプションを設定しない状態に戻します。
-
再度J2EEサーバを起動します。