Hibernate のArrayコレクション・マッピング
2008/07/28 12:02Update
サンプル Hibernate のArrayコレクション・マッピング方法について学びます。
Hibernateコレクション・マッピングの詳細について、公式のリファレンス
をご参照ください。
次のサンプルから説明します。
◇ 親テーブル
◇ 子テーブル
SONのFATHER_IDはforeignキーで、SON.FATHER_ID = FATHER.IDとします。
SONのIDXはSONの順序を保持するための数字型のフィールドです。
即ち、テーブルFATHERはSONと1対多の関係で、HibernateのArrayコレクションを用いるマッピング方法は次の通りです。
Father.java
Son.java
Father.hbm.xml
※<key column="..." />のcolumnは「多」側テーブルの親テーブルと関連するカラム名を指定します。
※<index column="..." />のcolumnは「多」側の要素のインデックスを保持するカラム名を指定します。このカラムはHibernateによって自動的に処理されますので、「多」側テーブルのマッピング定義(.hbm.xml)にこのカラムを書く必要がありません。
※<one-to-many class="..." />でArrayコレクションにセットされる要素値の型を指定します。
Son.hbm.xml
ここでは、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 にはLazy loadができませんので、性能面を考えると、Hibernate Arrayの使用を避けるべきです。
※詳細は次の参考資料をご参照ください。
HibernateのコレクションSet/Map/List/Array/Bagの比較(1)
をご参照ください。次のサンプルから説明します。
テーブル
◇ 親テーブル
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.javapublic class Father implements java.io.Serializable {
// Fields
private int id;
private String name;
private Son[] sonArray;
// setter/getter
...
}
Son.javapublic 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)
Sponsored Link
- Relative Articles
- Hibernate設定ファイルその1 - hibernate.cfg.xml - (2008/07/09 14:08)
- Hibernate c3p0 - よく利用されているコネクションプーリング - (2008/07/09 15:00)
- Hibernate 方言(Dialect)一覧 - (2008/07/09 15:10)
- Hibernate のSessionとSessionFactory - (2008/07/09 15:51)
- ThreadLocal でHibernate Session を効率的に管理する - (2008/07/09 18:43)
- Hibernateで複数のDBに接続するには? - (2008/07/09 18:47)
- Hibernateとは - (2008/07/11 14:23)
- Hibernate のインストール - (2008/07/24 11:01)
- Hibernate の開発手順 - (2008/07/24 12:44)
- Hibernate SQLをログに出力方法 - (2008/07/30 16:06)