30.5.2. リレーションシップの宣言

ejb-jar.xml ファイルでのリレーションシップの宣言は複雑でエラーが発生しやすくなっています。CMR フィールドの配備記述子管理は XDoclet などのツール使用を推奨していますが、記述子について理解しておくことが重要です。以下で organization/gangster リレーションシップの宣言について説明します。
<ejb-jar>
    <relationships>
        <ejb-relation>
            <ejb-relation-name>Organization-Gangster</ejb-relation-name>
            <ejb-relationship-role>
                <ejb-relationship-role-name>org-has-gangsters </ejb-relationship-role-name>
                <multiplicity>One</multiplicity>
                <relationship-role-source>
                    <ejb-name>OrganizationEJB</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <cmr-field-name>memberGangsters</cmr-field-name>
                    <cmr-field-type>java.util.Set</cmr-field-type>
                </cmr-field>
            </ejb-relationship-role>
            <ejb-relationship-role>
                <ejb-relationship-role-name>
                    gangster-belongs-to-org
                </ejb-relationship-role-name>
                <multiplicity>Many</multiplicity>
                <cascade-delete/>
                <relationship-role-source>
                    <ejb-name>GangsterEJB</ejb-name>
                </relationship-role-source>
                <cmr-field>
                    <cmr-field-name>organization</cmr-field-name>
                </cmr-field>
            </ejb-relationship-role>
        </ejb-relation>
    </relationships>
</ejb-jar>
これを見ればわかるように、トップレベルの relationships 要素内で ejb-relation 要素付きのリレーションシップを宣言しています。リレーションシップには ejb-relation-name 要素で名前が付けられます。これは jbosscmp-jdbc.xml ファイルで名前によってロールを参照するので重要です。各 ejb-relation には 2 つの ejb-relationship-role 要素があります(リレーションシップの各サイドに一つずつ)。ejb-relationship-role タグは以下のようになります。
  • ejb-relationshiprole-name: ロールを識別し、jbosscmp-jdbc.xml ファイルをマッピングするデータベースとマッチさせるのに使用する任意の要素です。リレーションシップの各サイドに対するロール名はそれぞれ異なるものにしてください。
  • multiplicity: これはリレーションシップのこちら側の多重度を示します。One または Manyが値です。この例の場合、1 つの organization から 複数の gangster への関係なので、organization の多重度は One で、gangster は Manyになります。XML 要素と同様、大文字小文字が区別されますので注意してください。
  • cascade-delete: この任意の要素が有効な場合、親エンティティが削除されると、子エンティティも削除されます。カスケードの削除は、リレーションシップの他サイドの多重度が 1 であるロールにのみ有効です。デフォルトでは、カスケードの削除はオフに設定されています。
  • relationship-role-source
    • ejb-name: 必須の要素で、ロールを持つエンティティの名称を付与します。
  • cmr-field
    • cmr-field-name: エンティティの CMR フィールドの名前がある場合は、その名称のことです。
    • cmr-field-type: フィールドがコレクションタイプであれば、これは CMR フィールドのタイプです。java.util.Collection または java.util.Set になります。
CMR フィールドの抽象アクセッサーを追加し、リレーションシップを宣言すると、リレーションシップが機能するようになります。次のセクションでは、リレーションシップのデータベースマッピングについて解説します。