6.3.5. の使用
エンティティは合成識別子(代理キー)を持つべきだと提唱されていましたが、 以前に示した多対多関連と値のコレクションの多くはすべて、複合キーでテーブルに マッピングされています。合成値のコレクションには利点がある かも しれませんが純粋な関連テーブルは代理キーを使っても特に利点があるとは思えません。 このような理由で、Hibernate は代理キーを持つテーブルへ多対多関連と値のコレクションをマッピングできる機能も備えています。
<idbag>
要素では、bag のセマンティックスを持つList
(または Collection
)をマッピングできます。例えば、
<idbag name="lovers" table="LOVERS"> <collection-id column="ID" type="long"> <generator class="sequence"/> </collection-id> <key column="PERSON1"/> <many-to-many column="PERSON2" class="Person" fetch="join"/> </idbag>
<idbag>
はエンティティクラスのように人工的な id ジェネレータを持っており、異なる代理キーをそれぞれのコレクションの列に割り当てます。しかし、Hibernate はある行の代理キーの値を見つけ出すメカニズムを持っていません。
<idbag>
更新のパフォーマンスは通常の <bag>
よりも勝ります。Hibernate は個々の行を効率的に見つけることができ、 list や map 、set のように個別にその行を更新、削除できます。
現在の実装では、
native
という id 生成戦略を <idbag>
コレクションの識別子に対して使えません。