Hibernate--繼承對映

BtWangZhi發表於2017-09-13

1 多個結構整合到一張表中
1.1 比如Person類為父類,Teacher類和Student類均繼承中,講三個類生產一張表。
表結構說明:
這裡寫圖片描述

public class Person {

    private Integer id;

    private String name;
//省略get與set
public class Student extends Person{

    private String work;
//省略get與set
public class Teacher extends Person{

    private Integer salary;
//省略get與set

對映檔案:

<class name="Person" table="person">
        <id name="id" type="integer" column="id">
            <generator class="native"></generator>
        </id>
        <!-- 鑑別器 區分student金額teacher的-->
        <!-- 應該放在id和composite的後面 -->        
        <discriminator column="type" type="string"/>
        <property name="name"/>
        <!-- 子類  discriminator-value設定一個值由框架裡幫助我們生成-->
        <subclass name="Student" discriminator-value="s">
            <property name="work"/>
        </subclass>
        <!-- 子類 -->
        <subclass name="Teacher" discriminator-value="t">
            <property name="salary"/>
        </subclass>
    </class>

discriminator 標籤為鑑別器,必須放在id和composite後,用來區分子類,各個子類中設定屬性discriminator-value來區分具體子類。即為type賦值。
生產的表結構:
這裡寫圖片描述
1.2 新增資料

        Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Student student=new Student();
        student.setId(1);
        student.setName("小強");
        student.setWork("寫作業");

        Teacher teacher=new Teacher();
        teacher.setId(2);
        teacher.setName("小張");
        teacher.setSalary(1000);
        session.save(student);
        session.save(teacher);  
        tx.commit();

各個物件單獨儲存,框架根據配置檔案中的配置discriminator-value自動為設定的區分欄位賦值。
執行上述程式碼後產生的資料為:
這裡寫圖片描述
特別要注意紅色的方框框中的內容,都是框架根據配置檔案中的內容來自動生成的。

2 每個具體類一張表
同樣是三個類,一個父類Person,兩個子類Teacher類、Student類。其中的屬性同上。
配置 檔案:

<!-- 定義abstract="true"後將假定該父類為抽象類,不會產生該表 -->
    <class name="Person" table="person" abstract="true">
        <id name="id" type="integer" column="id">
            <generator class="assigned"></generator>
        </id>
        <property name="name"/>
        <union-subclass name="Student" table="student">
            <property name="work"/>
        </union-subclass>
        <union-subclass name="Teacher" table="teacher">
            <property name="salary"/>
        </union-subclass>
    </class>

不允許在父類中使用標示生成策略,建議使用UUID、assigned。
將產生三張表,兩個子類將會繼承父類中的欄位,生成的表結構:
這裡寫圖片描述
插入資料:

Session session = HibernateUtil.getSessionFactory().getCurrentSession();
        Transaction tx = session.beginTransaction();
        Student student=new Student();
        student.setId(1);
        student.setName("小強");
        student.setWork("寫作業");

        Teacher teacher=new Teacher();
        teacher.setId(2);
        teacher.setName("小張");
        teacher.setSalary(1000);
        session.save(student);
        session.save(teacher);  
        tx.commit();

3 每個子類一張表,
每一子類將會只存在在中已定義的欄位。

<class name="Person" table="person" abstract="true">
        <id name="id" column="id">
            <generator class="assigned"></generator>
        </id>
        <discriminator column="type" type="string"/>
        <property name="name"/>
        <subclass name="Student" discriminator-value="s">
            <join table="student">
                <key column="id"/>
                <property name="work"/>
            </join>
        </subclass>
        <subclass name="Teacher" discriminator-value="t">
            <join table="teacher">
                <key column="id"/>
                <property name="salary"/>
            </join>
        </subclass>
    </class>

生成的表結構:
這裡寫圖片描述

相關文章