6.2.4. 値のコレクションと多対多関連

6.2.4. 値のコレクションと多対多関連

値のコレクションや多対多関連は、専用の コレクションテーブル が必要です。このテーブルは、外部キーカラムと、 コレクション要素のカラム と、場合によってはインデックスカラムを持ちます。

値のコレクションのために、 <element> タグを使用します。

<element
        column="column_name"
        formula="any SQL expression"
        type="typename"
        length="L"
        precision="P"
        scale="S"
        not-null="true|false"
        unique="true|false"
        node="element-name"
/>

column (オプション): コレクション要素の値を持っているカラムの名前。

formula (オプション): 要素を評価するために使用される SQL 式。

type (必須): コレクション要素のタイプ。

多対多関連<many-to-many> 要素を使用するように指定されています。

<many-to-many
        column="column_name"
        formula="any SQL expression"
        class="ClassName"
        fetch="select|join"
        unique="true|false"
        not-found="ignore|exception"
        entity-name="EntityName"
        property-ref="propertyNameFromAssociatedClass"
        node="element-name"
        embed-xml="true|false"
    />

column (オプション): 要素の外部キーカラムの名前。

formula (オプション): 要素の外部キーを評価するために使用される SQL 式。

class (必須): 関連クラスの名前。

fetch (オプション - デフォルトは join): この関連のために外部結合又は順次選択フェッチを有効します。これは特別なケースです: エンティティとその他のエンティティに対する多対多関連の完全な eager フェッチには (シングル SELECT 内で) 、コレクションそのものだけでなく、 <many-to-many> ネストされた要素上のこの属性と共に join フェッチを有効にします。

unique (オプション): 外部キーカラムのためのユニークな制約の DDL 生成を有効にします。これは関連の多様性を効率的に一対多にします。

not-found (オプション - デフォルトは exception): 参照先の行がない外部キーをどのように扱うかを指定します: ignore を指定すると、行がないことを関連がないものとして扱います。

entity-name (オプション): class の代替である関連クラスのエンティティ名。 class の代わりに指定する、関連クラスのエンティティ名。

property-ref: (オプション) この外部キーに加わる、関連クラスのプロパティの名前。指定されていない場合は、関連クラスの主キーが使用されます。

以下にいくつか例を示します。まずは string の set に関しての例です。

<set name="names" table="person_names">
    <key column="person_id"/>
    <element column="person_name" type="string"/>
</set>

整数値を含む bag (bagは order-by 属性によって反復順序が定義されています):

<bag name="sizes" 
        table="item_sizes" 
        order-by="size asc">
    <key column="item_id"/>
    <element column="size" type="integer"/>
</bag>

エンティティの配列 - この場合、多対多の関連です。

<array name="addresses" 
        table="PersonAddress" 
        cascade="persist">
    <key column="personId"/>
    <list-index column="sortOrder"/>
    <many-to-many column="addressId" class="Address"/>
</array>

文字列と日付の map

<map name="holidays" 
        table="holidays" 
        schema="dbo" 
        order-by="hol_name asc">
    <key column="id"/>
    <map-key column="hol_name" type="string"/>
    <element column="hol_date" type="date"/>
</map>

コンポーネントの list (次の章で詳しく説明します)

<list name="carComponents" 
        table="CarComponents">
    <key column="carId"/>
    <list-index column="sortOrder"/>
    <composite-element class="CarComponent">
        <property name="price"/>
        <property name="type"/>
        <property name="serialNumber" column="serialNum"/>
    </composite-element>
</list>