7.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): この関連にたいする外部結合もしくは順次選択フェッチを有効にします。 以下は特別なケースです;あるエンティティの単数SELECTにおける完全即時フェッチ、そして他のエンティティとの多対多関係については、 コレクション自体のみにだけでなく、<many-to-many> にネストした要素にある属性についてもjoinフェッチを有効にします。
|
| unique (オプション): 外部キーカラムに対し、一意制約のDDL生成を 有効にします。関連の多重度を効果的に一対多に変更します。
|
| not-found (オプション - デフォルトは exception): 参照先の行がない外部キーをどのように処理するか指定します:ignore は、行がないことを関連がないものとして扱います。
|
| entity-name (オプション):class の代わりとなる、 関連クラスのエンティティ名。
|
| property-ref (オプション): 外部キーに結合された、 関連クラスのプロパティ名。指定されていない場合は、関連クラスの主キーを使用します。
|
以下にいくつかの例を挙げています。
文字列セット:
<set name="names" table="person_names">
<key column="person_id"/>
<element column="person_name" type="string"/>
</set>
order-by 属性が決定した反復順序となっている整数を含むbag
<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 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>







