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"
と宣言しないようにしてください。