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 いずれのメソッドも必要です。