Interstage Application Server J2EE ユーザーズガイド |
目次 索引 |
第3部 EJB編 | > 第9章 EJBサービスの機能 | > 9.2 Entity Beanの実行環境 |
CMP2.0を使用する場合、Bean間/オブジェクト間のrelationshipが定義できるようになったため、データベースのテーブル間の関連づけが簡単に行えます。
このデータベースのテーブルとテーブルの間の関係が、relationship(リレーション)です。
relationship定義を行うことによって、各Bean間の参照関係が定義できます。1つのrelationship定義は2つのEntity Bean間の関係をモデル化します。
あるEntity Beanが、もう一方のEntity BeanのCMRフィールドをリファレンスとして保持する場合、これら2つのEntity Bean間は単方向のリレーションとなります。また、2つのBeanが互いにリファレンスを持ち、どちら側からも参照可能な場合は、双方向のリレーションとなります。このように参照状態をリレーションの方向(リファレンス)として表します。
またEntity Bean間のリレーションには、1:1、1:多、多:多という形態がサポートされます。
各Entity Beanに対して、1(One)、または多(Many)のいずれかを“多重度”として指定します。
リレーションを持っているA BeanとB Beanを例とした場合、Aの多重度が「1」の場合、BはAと1リレーションだけ持つことができます。
一方、Bの多重度が「多」の場合には、AはBと複数のリレーションを持つことができます。したがって、A BeanとB Beanは「1:多」という形態のリレーションになります。
以下の定義をdeployment descriptorファイルに記述します。
CMRフィールドとは、Bean間の永続的な関係を保持するフィールドです。relationship定義内にCMRフィールドが記述されているBeanは、もう一方のBeanを参照できます。
Beanの関係をあらわす方法として単方向または双方向があります。
種類 |
説明 |
単方向 |
Bean AはBean Bを参照できるが、Bean BはBean Aを参照できない。 |
双方向 |
Bean AはBean Bを参照でき、逆にBean BはBean Aを参照できる。 |
Bean間の多重度は以下の3種類です。以下にそれぞれの多重度の例を説明します。
種類 |
例 |
1:1 |
顧客とクレジットカードの関係。顧客1人とクレジットカード1枚は対応している。 |
1:多 |
顧客と電話番号の関係。1人の顧客が多くの電話番号(自宅、携帯、職場など)を持っている状態。 |
多:多 |
顧客とイベントの関係。1人の顧客は何度もイベントに参加でき、1回のイベントには複数の顧客が参加する。 |
また、Enterprise BeanクラスでCMRフィールドに対するget/setアクセッサメソッドを定義し、定義したアクセッサメソッドを使用して、relationshipの設定や変更を行います。
コンテナは、deployment descriptorに定義されたrelationshipを参照して、Bean間の関係を管理します。
コンテナデータベーステーブルのrelationshipを自動的に判断するために、外部キー(データベーステーブルにおけるカラムのうち、他のテーブルにおけるプライマリキーに対応するもの)を使用します。
外部キーは、1:1で双方向のリレーションの場合だけでなく、1:1で単方向のリレーションの場合においても必要です。
例えば、1:1で単方向のリレーションを持つEJBアプリケーションを、途中で1:1の双方向のリレーションに変更した場合、始めから外部キーを定義していないとデータベースを再構築する必要があります。このため、1:1で単方向のリレーションの場合においても、あらかじめ外部キーを定義しておきます。
以下に1:1 relationshipの例として、Customer(顧客)とCredit Card(クレジットカード)の関係を示します。
例のようなデータベーステーブルがある場合、例えばIDが001であるCustomerのクレジットカードについての情報をたどれます。
以下に多:多 relationshipの例として、Customer(顧客)とEvent(イベント)の関係を示します。
例えば2002/12/24(プライマリキー)のクリスマスパーティイベントにID(プライマリキー)が001であるCustomerが参加する場合、多:多の関係が更新され、Joinテープルが更新されます。
CMP2.0Beanのレコードが破棄されると、コンテナはそのBeanが保持しているrelationshipから関連づけられたBeanのレコードを削除します。例えばCustomerレコードの破棄に伴い、CreditCardBeanレコードの破棄もできます。
これを“cascade-delete”と呼び、1:1または1:多の関係においてdeployment descriptorには<cascade-delete>要素を指定することで有効となります。多:多の場合、例えばCustomer:Eventでは、1人の顧客がイベントの参加をキャンセルしてもイベントが開催中止にはならないため、cascade-deleteは意味を持ちません。
relationshipのあるアプリケーションは、Enterprise Bean名で関係付けられます。EJBアプリケーション名(JNDI名)を変更して複数配備した場合でもEnterprise Bean名は変わらないために以下に注意してください。
同名のEnterprise Beanが存在した場合には、relationshipの整合性を保つために、一方のEJBアプリケーションのCMFマッピング定義/Relation定義を変更すると双方の定義が更新されます。
目次 索引 |