Hibernate subclassを利用する 継承 マッピングの実装
2009/12/22 18:24Update
Hibernateも、継承 マッピングという概念があり、3つの基本的な継承のマッピング戦略をサポートします。 本文は、subclassを利用して Hibernateの継承 マッピングを実装してみます。
オブジェクト指向言語のJavaには、親クラスを継承しそのクラスのフィールドやメソッドをまるで自分のもののように扱うことができます。
Hibernateも、継承 マッピングという概念があり、3つの基本的な継承のマッピング戦略をサポートします。 本文は、subclassを利用して Hibernateの継承 マッピングを実装してみます。
手順は以下の通りになります。
オブジェクトの視点で、以下のようなクラス階層にしたいと想定します。
クラスAの定義(A.java)
クラスBの定義(Aクラスから継承。B.java)
A.hbm.xml
Aと他のテーブルのEntityとのマッピング定義(one-to-one、many-to-oneなど)があった場合も、継承・反映されます。
第10章 継承マッピング
「Redhat.com Hibernateドキュメント」
Hibernateも、継承 マッピングという概念があり、3つの基本的な継承のマッピング戦略をサポートします。 本文は、subclassを利用して Hibernateの継承 マッピングを実装してみます。
手順は以下の通りになります。
継承クラスからの考案
オブジェクトの視点で、以下のようなクラス階層にしたいと想定します。
クラスAの定義(A.java)
class A {
String id;
String name;
String value;
//setter/getter 略
}
クラスBの定義(Aクラスから継承。B.java)
class B extends A {
String b1;
String b2;
//setter/getter 略
}
マッピング定義例
A.hbm.xml
<class name="A" table="TABLE_A" lazy="true"> <id name="id" type="string" column="ID" length="32"> <generator class="uuid.hex" /> </id> <property name="name" type="string" column="NAME" not-null="false" /> <property name="value" type="string" column="VALUE" not-null="false" /> <!-- sub class/B --> <joined-subclass name="B" table="TABLE_B"> <key column="A_ID"/> <property name="b1" type="string" column="B1" /> <property name="b2" type="string" column="B2" /> </joined-subclass> </class>
テーブル定義例
create table TABLE_A (
ID varchar(32) not null,
NAME varchar(100),
VALUE varchar(100),
primary key (ID)
);
create table TABLE_B (
A_ID varchar(32) not null,
B1 varchar(100),
B2 varchar(100),
primary key (A_ID)
);
alter table TABLE_B
add index FK304B674EB05136E7 (A_ID),
add constraint FK304B674EB05136E7
foreign key (A_ID)
references TABLE_A (ID);
ID varchar(32) not null,
NAME varchar(100),
VALUE varchar(100),
primary key (ID)
);
create table TABLE_B (
A_ID varchar(32) not null,
B1 varchar(100),
B2 varchar(100),
primary key (A_ID)
);
alter table TABLE_B
add index FK304B674EB05136E7 (A_ID),
add constraint FK304B674EB05136E7
foreign key (A_ID)
references TABLE_A (ID);
Hibernate使用例
Session session = ... String pk = ...; //get A entity A a = (A)session.get(A.class, pk); //save A entity to table session.save(a); //aを保存すると、TABLE_Aにデータが挿入されます。 //get B entity B b = (B)session.get(B.class, pk); //save B entity to table session.save(b); //bを保存すると、TABLE_AとTABLE_Bにデータが挿入されます。
Aと他のテーブルのEntityとのマッピング定義(one-to-one、many-to-oneなど)があった場合も、継承・反映されます。
参考資料
第10章 継承マッピング
「Redhat.com Hibernateドキュメント」
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)