[Hibernate]バリュー型のコレクション
商品と商品画像のように、DBのテーブルは1:nの関係にあるが、
コード上では商品クラスは画像名のみ欲しい場合のマッピング。
ItemテーブルとItemImageテーブルが外部キーitem_idで関連している場合
Item.hbm
<set name=“imageNames” table=“ITEM_IMAGE”> <!-- 関連先のテーブルの外部キー --> <key column=“ITEM_ID”> <!-- one-to-manyではなくelementを使う --> <element type=“string” column=“FILE_NAME”> </set>
Item.java
private Set<String> itemImages = new TreeSet();
この関連はcascade="all"にしても保存、削除は行われない。
また、上記はSetなのでitem_idとfile_nameが同じItemImageが紐づいていると、
一つしか取得できない。
上記の例では問題ないだろうが、idbagを用いることで、重複を許可することもできる。
<idbag name="itemImageBag" table="item_image"> <collection-id type="long" column="image_id"> <generator class="increment"></generator> </collection-id> <key> <column name="ref_item_id" not-null="true" /> </key> <element type="string" column="FILE_NAME" /> </idbag>
Item.java
private Collection<String> itemImages = new LinkedList();
idbagを利用した場合でも、cascadeの設定は無意味だが、常にall-delete-orphanと同様の挙動となる。