7.3.2. 双方向関連
双方向関連 は関連のどちら「側」からでもナビゲーションできます。2種類の双方向関連がサポートされています:
- one-to-many
- 片側が set か bag の値、もう片方が単一値です。
- many-to-many
- 両側が set か bag です。
2つの多対多関連を同じデータベーステーブルにマッピングし、片方を inverse として宣言することで、双方向の多対多関連を指定することが出来ます。インデックス付きのコレクションは使えません。
以下は双方向の多対多関連の例です。この例では、どのように各カテゴリは多数のアイテムを持つことができ、各アイテムは多くのカテゴリに属することが出来るかを示しています。
関連の inverse 側にのみ行われた変更は永続化されません。これは、Hibernate は全ての双方向関連について、メモリ上に2つの表現を持っているという意味です。つまり一つは A から B へのリンクで、もう一つは B から A へのリンクです。Java のオブジェクトモデルで Java 言語で双方向関係をどのように作るかを考えれば、これは理解しやすいです。
category.getItems().add(item); // The category now "knows" about the relationship item.getCategories().add(category); // The item now "knows" about the relationship session.persist(item); // The relationship won't be saved! session.persist(category); // The relationship will be saved
category.getItems().add(item); // The category now "knows" about the relationship
item.getCategories().add(category); // The item now "knows" about the relationship
session.persist(item); // The relationship won't be saved!
session.persist(category); // The relationship will be saved
関連の inverse ではない側は、メモリ上の表現をデータベースに保存するのに使われます。
双方向の一対多関連を定義するには、一対多関連を多対一関連と同じテーブルのカラムにマッピングし、多側に
inverse="true" と宣言します。
関連の片側に
inverse="true" をマッピングしても、これらは直交概念であるため、カスケード操作に影響を与えません。