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

2008/07/28 12:02Update
TAGS: Hibernate | Arrayコレクション

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

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


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


テーブル



◇ 親テーブル
create table FATHER (
    ID integer not null,
    NAME varchar(100),
    primary key (ID)
)


◇ 子テーブル
create table SON (
    id integer not null,
    NAME varchar(100),
    FATHER_ID integer,
    IDX integer,
    primary key (id)
)
alter table SON 
    add index FK1417282DD016B (FATHER_ID), 
    add constraint FK1417282DD016B 
    foreign key (FATHER_ID) 
    references FATHER (ID)


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

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

Hibernateエンティティ



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

    // Fields
    private int id;
    private String name;
    private Son[] sonArray;

    // setter/getter

    ...

}



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

    // Fields
    private int id;
    private String name;

    // setter/getter

    ...

}



Hibernateマッピング・設定


Father.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >

<hibernate-mapping>
    <class name="entity.Father" table="FATHER">
        <id name="id" unsaved-value="0" column="ID">
             <generator class="increment"/>
        </id>

        <array name="sonArray" cascade="all">
             <key column="FATHER_ID"/>
             <index column="IDX"/>
             <one-to-many class="entity.Son"/>
        </array>
        <property name="name" type="string" length="100" column="NAME" />
    </class>
</hibernate-mapping>

※<key column="..." />のcolumnは「多」側テーブルの親テーブルと関連するカラム名を指定します。
※<index column="..." />のcolumnは「多」側の要素のインデックスを保持するカラム名を指定します。このカラムはHibernateによって自動的に処理されますので、「多」側テーブルのマッピング定義(.hbm.xml)にこのカラムを書く必要がありません。
※<one-to-many class="..." />でArrayコレクションにセットされる要素値の型を指定します。

Son.hbm.xml
<hibernate-mapping>
    <class name="test.array.Son" table="SON">
        <id name="id" unsaved-value="0">
             <generator class="increment"/>
        </id>
        <property name="name" column="NAME" type="string" length="100"/>
    </class>
</hibernate-mapping>


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

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

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



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

Son [] sonArray = father.getSonArray();

if (sonArray != null && sonArray.length > 0) {
    System.out.println(sonArray[0].getName());
}


注意:Hibernate Array にはLazy loadができませんので、性能面を考えると、Hibernate Arrayの使用を避けるべきです。
※詳細は次の参考資料をご参照ください。

参考資料


HibernateのコレクションSet/Map/List/Array/Bagの比較(1)

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

Sponsored Link


Comments