30.5. コンテナー管理リレーション
コンテナー管理リレーション (CMR: Container Managed Relationship) は、CMP 2.0 の力強い新機能です。プログラマーは EJB 1.0 導入時(当然、データベースも登場)からエンティティオブジェクト間のリレーションシップを作成していますが、CMP 2.0 以前は関連エンティティのプライマリキーを抽出するため各リレーションのコードを書き、擬似外部キーフィールドに格納しなければなりませんでした。シンプルなリレーションシップはコード化するのも簡単ですが、参照整合性のある複雑なリレーションシップはコード化作業に相当の時間が必要でした。CMP 2.0 があれば、手作業でリレーションをコード化する必要はなくなります。コンテナーは、参照整合性のある 1対1、1対多、または多対多のリレーションシップを管理できます。ただし、ローカルインターフェース間でしか定義できないのが唯一の制限事項です。つまり、同じアプリケーションサーバー内でもアプリケーションが異なる 2 つのエンティティではリレーションシップを作成できないのです。
コンテナー管理リレーションの作成には、基本的に 2 種類の方法があります。
cmr-field
抽象アクセッサーを作成し、ejb-jar.xml
ファイルでリレーションシップを宣言します。次の 2 つの項では、このステップを説明します。
30.5.1. CMR-Field 抽象アクセッサー
CMR-Field 抽象アクセッサーの署名は
cmp-fields
と同じですが、 ただし、値を1つ持つリレーションシップは、それに関連するエンティティのローカルインターフェースを返す必要があります。また、複数の値を持つリレーションシップは java.util.Collection
(または java.util.Set
) オブジェクトしか返すことができません。たとえば、organization と gangster の 1 対多のリレーションシップを宣言するには、 OrganizationBean
クラスで organization から gangster への関係を宣言します。
public abstract class OrganizationBean implements EntityBean { public abstract Set getMemberGangsters(); public abstract void setMemberGangsters(Set gangsters); }
また gangster から organization へのリレーションシップを
GangsterBean
クラスで宣言することもできます。
public abstract class GangsterBean implements EntityBean { public abstract Organization getOrganization(); public abstract void setOrganization(Organization org); }
各 bean は CMR フィールドで宣言されますが、リレーションシップの 2 つの bean のうち一つにアクセッサーセットを設定してください。CMP フィールドは getter と setter いずれのメソッドも必要です。