Hibernate入門


Hibernate のListコレクション・マッピング

2008/07/24 16:24Update
TAGS: Hibernate | Listコレクション

Syboos.jp編集長

Hibernate のListコレクション・マッピング方法について学びます。

Hibernateコレクション・マッピングの詳細について、公式のリファレンス をご参照ください。

サンプルから説明します。

テーブル



◇ FATHER(ID, NAME)
◇ SON(ID, NAME, ORDER_INDEX, FATHER_ID)

SONのFATHER_IDはforeignキーで、SON.FATHER_ID = FATHER.IDとします。
SONのORDER_INDEXはSONの順序を保持するためのフィールドで、integerの型となります。

即ち、テーブルFATHERはSONと1対多の関係で、HibernateのListコレクションを用いるマッピング方法は次の通りです。

Hibernateエンティティ


Father.java
public class Father  implements java.io.Serializable {   

    // Fields

    private String id;
    private String name;
    private java.util.List sonList;

    // setter/getter

    ...

}


Hibernateマッピング・設定


Father.hbm.xml
<hibernate-mapping>
    <class name="entity.Father" table="FATHER">
        <id name="id" type="string" column="ID" length="32">
            <generator class="uuid.hex" />
        </id>
        <property name="name" column="NAME" type="string"  not-null="true" length="100" />

        <list name="sonList" table="SON">
            <key column="FATHER_ID"></key>
            <list-index column="ORDER_INDEX" />
            <one-to-many class="entity.Son" />
        </list>
    </class>
</hibernate-mapping>

※<list-index column="..." />のcolumnは「多」側の要素のインデックスを保持するカラム名を指定します。
※<one-to-many class="..." />でListコレクションにセットされる要素値の型を指定します。

ちなみに、Listインタフェースは次の通りです。

//抜粋
package java.util;
public interface List
{
...
    public abstract boolean add(Object obj);
...
    public abstract Object get(int i);
    public abstract Object set(int i, Object obj);
    public abstract void add(int i, Object obj);
...
}


HibernateのListコレクションでは、Objectを追加(put)・取得(get)するのに、インデックスは必要となります。
この「インデックス」を<list-index column="..." />よって指定します。

ここでは、entity.Sonクラスという型を指定していますが、elementによる「多」側のテーブルのフィールドを指定することもできます。
        <list name="sonNameList" table="SON">
            <key column="FATHER_ID"></key>
            <list-index column="ORDER_INDEX" />
            <element type="string" column="NAME" not-null="true"/>
        </list>


さらに、composite-elementによる次のような複雑な設定もできます。
        <list name="sonList" table="SON">
            <key column="FATHER_ID"></key>
            <list-index column="ORDER_INDEX" />
            <composite-element class="entity.Son">
                <property name="id"/>
                <property name="name"/>
            </composite-element>
        </list>


HibernateのListコレクション・マッピングの使用例


Father father = ...;//session.get(Father.class, id);

List<Son> sonList = (List<Son>)father.getSonList();

if (sonList != null && sonList.size() > 0) {
    System.out.println(sonList.get(0).getName());
}

Sponsored Link