6.3.5. <idbag>の使用

6.3.5. <idbag>の使用

複合キーは悪いもので、エンティティは人工の識別子(代理キー)を持つべきであるという考え方からは、多対多関連と値のコレクションを複合キーを用いたテーブルへマッピングするのは少し奇妙に感じるかもしれません。確かにこの考え方には議論の余地があります。純粋な関連テーブルは代理キーを使っても利益を得られないように思えるからです (合成値のコレクションは利益がある かも しれませんが)。とはいえ、 Hibernate は代理キーを持つテーブルへ多対多関連と値のコレクションをマッピングする機能も備えています。

bag のセマンティックスを持った List(または Collection)を <idbag> 要素にマッピングできます。

<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> コレクションの識別子に対して使えません。