5.1.10. many-to-one

5.1.10. many-to-one

他の永続クラスへの通常の関連は many-to-one 要素を使って定義します。リレーショナルモデルは多対一関連です。つまりあるテーブルの外部キーは、ターゲットとなるテーブルの主キーカラムを参照しています。

<many-to-one
        name="propertyName"
        column="column_name"
        class="ClassName"
        cascade="cascade_style"
        fetch="join|select"
        update="true|false"
        insert="true|false"
        property-ref="propertyNameFromAssociatedClass"
        access="field|property|ClassName"
        unique="true|false"
        not-null="true|false"
        optimistic-lock="true|false"
        lazy="proxy|no-proxy|false"
        not-found="ignore|exception"
        entity-name="EntityName"
        formula="arbitrary SQL expression"
        node="element-name|@attribute-name|element/@attribute|."
        embed-xml="true|false"
        index="index_name"
        unique_key="unique_key_id"
        foreign-key="foreign_key_name"
/>

name:プロパティ名。

column (オプション):外部キーカラムの名前。ネストした <column> カラムによっても指定されます。

class(オプション - デフォルトはリフレクションにより決定されるプロパティの型): 関連クラスの名前。

cascade(オプション): どの操作を、親オブジェクトから関連オブジェクトへとカスケードさせるかを指定します。

fetch(オプション - デフォルトは select ): 外部結合フェッチと順次選択フェッチ(sequential select fetch)のどちらかを選択します。

update, insert(オプション - デフォルトは true ): マッピングされたカラムが SQL の UPDATE または INSERT 文に含まれることを指定します。両方とも false に設定すると、その値が同じカラムにマッピングされた他のプロパティやトリガや他のアプリケーションによって初期化された純粋な「導出」プロパティが可能になります。

property-ref(オプション): この外部キーに結合された関連クラスのプロパティ名。何も指定しなければ、関連クラスの主キーが使われます。

access (オプション - デフォルトは property ): Hibernate がプロパティの値にアクセスするために使用すべき戦略。

unique(オプション): 外部キーカラムに対してユニーク制約をつけた DDL の生成を可能にします。また、 property-ref のターゲットにすることもできます。これにより関連の多重度を効果的に一対一にします。

not-null (オプション): 外部キーカラムに対して、 null 値を許可する DDL の生成を可能にします。

optimistic-lock (オプション - デフォルトは true ): このプロパティの更新に楽観的ロックの取得を要求するかどうかを指定します。言い換えれば、このプロパティがダーティであるときにバージョンを増やすべきかを決定します。

lazy (オプション - デフォルトは proxy ): デフォルトでは、多重度1の関連がプロキシとなります。 lazy="no-proxy" は、インスタンス変数に最初にアクセスしたときに、プロパティを遅延フェッチするよう指定します (ビルド時にバイトコード実装が必要になります)。 lazy="false" は関連を常に即時にフェッチするよう指定します。

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

entity-name (オプション):関連したクラスのエンティティ名。

formula (オプション): 計算された 外部キーに対して値を定義する SQL 式

cascade 属性に none 以外の意味のある値を設定すると、関連オブジェクトへある操作が伝播することになります。意味のある値とは Hibernate の基本操作の名前のことで、 delete-orphanall 、操作名をカンマで区切った組み合わせ (例えば cascade="persist,merge,evict"cascade="all,delete-orphan")、またそれだけでなく persist, merge, delete, save-update, evict, replicate, lock, refresh のことを指します。詳しい説明は 項10.11. 「連鎖的な永続化」 を参照してください。値が一つの関連 (many-to-one と one-to-one関連) は、単独での削除 (orphan delete) をサポートしていないことに注意してください。

典型的な many-to-one 宣言は次のようにシンプルです。:

<many-to-one name="product" class="Product" column="PRODUCT_ID"/>

property-ref 属性は、外部キーが関連付けられたテーブルの、主キーでないユニークキーを参照しているレガシーデータをマップするためにだけ使うべきです。これは醜いリレーショナルモデルです。例えば Product クラスが、主キーでないユニークなシリアルナンバーを持っていると仮定してみてください。( unique 属性は SchemaExport ツールを使った Hibernate の DDL 生成を制御します。)

<property name="serialNumber" unique="true" type="string" column="SERIAL_NUMBER"/>

以下のように OrderItem に対してマッピングを使えます:

<many-to-one name="product" property-ref="serialNumber" column="PRODUCT_SERIAL_NUMBER"/>

しかし、これは決して推奨できません。

参照したユニークキーが、関連するエンティティの多数のプロパティから構成される場合、指定した <properties> 要素内で、参照するプロパティをマッピングするべきです。

もし参照したユニークキーがコンポーネントのプロパティである場合は、プロパティのパスを指定できます:

<many-to-one name="owner" property-ref="identity.ssn" column="OWNER_SSN"/>