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

2008/07/24 15:32Update
TAGS: Hibernate | Mapコレクション

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

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

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

テーブル



◇ USER(ID, NAME)
◇ ADDRESS(ID, ADDR_NAME, CODE, USER_ID)

ADDRESSのUSER_IDはforeignキーで、ADDRESS.USER_ID = USER.IDとします。

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

Hibernateエンティティ


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

    // Fields

    private String id;
    private String name;
    private java.util.Map addressMap;

    // setter/getter

    ...

}


Hibernateマッピング・設定


User.hbm.xml
<hibernate-mapping>
    <class name="entity.User" table="USER">
        <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" /> 

        <map name="addressMap" table="ADDRESS">
            <key column="USER_ID"></key>
            <map-key column="CODE" type="string"></map-key>
            <one-to-many class="entity.Address" />
        </map>
    </class>
</hibernate-mapping>

※<map-key type="..." />でMapの要素の型を指定します。
※<one-to-many class="..." />でMapの要素の値を指定します。

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

//抜粋
package java.util;
public interface Map
{
...
    public abstract Object get(Object key);
    public abstract Object put(Object key, Object value);
    public abstract Object remove(Object key);
...
}

Setインタフェースも添付します。
//抜粋
package java.util;
public interface Set
    extends Collection
{
...
    public abstract boolean add(Object obj);
    public abstract boolean remove(Object obj);
...
}

よく見てください、java.util.Mapはjava.util.Setとの違い、Mapでは、Objectを追加(put)・取得(get)するのに、キーは必要となります。
この「キー」は<map-key type="..." />よって設定されます。

ここでは、entity.Addressクラスという型を指定していますが、elementによるテーブルのフィールドを指定することもできます。
        <map name="addressNameMap" table="ADDRESS">
            <key column="USER_ID"></key>
            <map-key column="CODE" type="string"></map-key>
            <element type="string" column="ADDR_NAME" not-null="true"/>
        </map>


さらに、composite-elementによる次のような複雑な設定もできます。
        <map name="addressMap" table="ADDRESS">
            <key column="USER_ID"></key>
            <map-key column="CODE" type="string"></map-key>
            <composite-element class="entity.Address">
                <property name="id"/>
                <property name="addrName"/>
            </composite-element>
        </map>


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


User user = ...;//session.get(User.class, id);

Map<String, Address> addressMap = (Map<String, Address>)user.getAddressMap();

System.out.println(addressMap.get("addressCode").getAddrName());

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments