Hibernate subclassを利用する 継承 マッピングの実装

2009/12/22 18:24Update
TAGS: Hibernate | subclass | 継承 | マッピング

Hibernateも、継承 マッピングという概念があり、3つの基本的な継承のマッピング戦略をサポートします。 本文は、subclassを利用して Hibernateの継承 マッピングを実装してみます。

オブジェクト指向言語のJavaには、親クラスを継承しそのクラスのフィールドやメソッドをまるで自分のもののように扱うことができます。
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);

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ドキュメント」

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments