7.4. 双方向関連

7.4.1. 一対多(One to many)/多対一(many to one)

双方向多対一関連 は最も一般的な関連です。以下の例で標準的な親子関係を示しています。
<class name="Person">
    <id name="id" column="personId">
        <generator class="native"/>
    </id>
    <many-to-one name="address" 
        column="addressId"
        not-null="true"/>
</class>

<class name="Address">
    <id name="id" column="addressId">
        <generator class="native"/>
    </id>
    <set name="people" inverse="true">
        <key column="addressId"/>
        <one-to-many class="Person"/>
    </set>
</class>
create table Person ( personId bigint not null primary key, addressId bigint not null )
create table Address ( addressId bigint not null primary key )
List (または他のインデックス付きのコレクション)を使う場合、 外部キーの key カラムを not null に設定します。Hibernateは、コレクション側からの関連を管理し、各要素のインデックスをメンテナンスします。 結果、update="false" かつ insert="false" と設定することで、仮想的に反対側をinverseにします。
<class name="Person">
   <id name="id"/>
   ...
   <many-to-one name="address"
      column="addressId"
      not-null="true"
      insert="false"
      update="false"/>
</class>

<class name="Address">
   <id name="id"/>
   ...
   <list name="people">
      <key column="addressId" not-null="true"/>
      <list-index column="peopleIdx"/>
      <one-to-many class="Person"/>
   </list>
</class>
外部キーカラムが NOT NULL であるならば、コレクションマッピングの <key> 要素を not-null="true" と定義することは重要です。入れ子になった <column> 要素だけではなく、 <key> 要素も not-null="true" と宣言しないようにしてください。