第21章 例: 親/子
新規ユーザーが Hibernate を使ってまず最初に扱うモデルの一つに、親子型関係のモデル化があります。このモデル化には二つのアプローチが存在します。とりわけ新規ユーザーにとって、さまざまな理由から最も便利だと思われるアプローチは、
親 から 子 への <one-to-many> 関連により 親 と 子 の両方をエンティティクラスとしてモデリングする方法です。もう一つの方法は、子 を <composite-element> として定義するものです。これで、Hibernate における一対多関連のデフォルトのセマンティクスが、通常の複合要素のマッピングよりも、親子関係のセマンティクスから遠いことがわかります。それでは親子関係を効率的かつ簡潔にモデリングするために、 カスケード操作を使った双方向一対多関連 の扱い方を説明します。
21.1. コレクションに関する注意 リンクのコピーリンクがクリップボードにコピーされました!
リンクのコピーリンクがクリップボードにコピーされました!
Hibernate のコレクションは自身のエンティティの論理的な部分と考えられ、決して包含するエンティティの一部ではありません。これは非常に大きく違い、以下のような結果をもたらす点に注意してください:
- オブジェクトをコレクションから削除、またはコレクションに追加するとき、コレクションのオーナーのバージョン番号はインクリメントされます。
- コレクションから削除されたオブジェクトが値型のインスタンス(例:複合要素) である場合、そのオブジェクトは永続的ではなくなり、その状態はデータベースから完全に削除されます。同じように、値型のインスタンスをコレクションに追加すると、その状態はすぐに永続的になります。
- 一方、エンティティがコレクション(一対多または多対多関連) から削除されても、デフォルトではそれは削除されません。この動作は完全に一貫しています。すなわち、他のエンティティの内部状態を変更しても、関連するエンティティが消滅すべきではないということです。同様に、エンティティがコレクションに追加されても、デフォルトではそのエンティティは永続的にはなりません。
デフォルトの動作では、エンティティをコレクションに追加すると単に二つのエンティティ間のリンクを作成し、一方エンティティを削除するとリンクも削除します。これはすべてのケースにおいて非常に適切です。これが適切でないのは親/子関係の場合です。この場合、子の生存は親のライフサイクルに制限されるからです。