daybreaksnow's diary

私を私と呼びたい

[Hibernate]バリュー型のコレクション

商品と商品画像のように、DBのテーブルは1:nの関係にあるが、
コード上では商品クラスは画像名のみ欲しい場合のマッピング。

ItemテーブルとItemImageテーブルが外部キーitem_idで関連している場合
f:id:daybreaksnow:20130128204258p:plain

Item.hbm

<set name=imageNamestable=ITEM_IMAGE”>
  <!-- 関連先のテーブルの外部キー -->
  <key column=ITEM_ID”>
  <!-- one-to-manyではなくelementを使う -->
  <element type=stringcolumn=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と同様の挙動となる。