Hibernate多表關係配置——繼承

爲了將程序領域中的繼承關係反映到數據中,Hibernate爲咱們提供了3中方案:java

  1. 一個具體子類對應一張表(每一個子類對應一張表,父類無表)
  2. 使用一張表表示全部繼承體系下的類的屬性的並集(整個繼承體系一張表,經過類型區分)
  3. 每一個子類使用一張表只存儲它特有的屬性,而後與父類所對應的表以一對一主鍵關聯的方式關聯起來(父類、子類都有表,使用主鍵關聯)

一、實體對象數據庫

1.1 父類實體(Person類)session

package demo.entity;

/**
 * 人實體(父類)
 * @author Don
 * @date:日期:2017年4月11日 時間:下午4:08:04*
 * @version 1.0
 */
public class Person {
    private String id;
    private String name;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
}
View Code

1.2 子類實體(Student類)app

package demo.entity;

import java.util.HashSet;
import java.util.Set;

/**
 * 學生實體(子類)
 * @author Don
 * @date:日期:2017年4月11日 時間:下午2:25:15*
 * @version 1.0
 */
public class Student extends Person {
    private String code;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }
}
View Code

1.3 子類實體(Teacher類)ide

package demo.entity;

/**
 * 教師實體(子類)
 * @author Don
 * @date:日期:2017年4月11日 時間:下午4:11:08*
 * @version 1.0
 */
public class Teacher extends Person {
    private String jobTitle;

    public String getJobTitle() {
        return jobTitle;
    }

    public void setJobTitle(String jobTitle) {
        this.jobTitle = jobTitle;
    }
}
View Code

二、數據庫關係映射配置測試

2.1 父類無表關係配置ui

<?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>
    <!-- name:實體, table:表名 -->
    <!-- 每一個具體子類對應一張表,試用<union-subclass>標籤,abstract爲true時標識父類無表 -->
    <class name="demo.entity.Person" abstract="true">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 生成主鍵-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name" />
        
        <union-subclass name="demo.entity.Student" table="ex_student" extends="demo.entity.Person">
            <property name="code"></property>
        </union-subclass>
        
        <union-subclass name="demo.entity.Teacher" table="ex_teacher" extends="demo.entity.Person">
            <property name="jobTitle"></property>
        </union-subclass>
    </class>
</hibernate-mapping>

2.2 整個體系一張表關係配置this

<?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>
    <!-- name:實體, table:表名 -->
    <!-- 使用一張表表示全部繼承體系下的類的屬性的並集,使用<discriminator>-->
    <class name="demo.entity.Person" table="ex_person">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 生成主鍵-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name" />
        <!-- 會在ex_person表中生成一個字段,用來標記記錄屬於哪個子類 -->
        <discriminator column="personType" type="string"></discriminator>
        
        <subclass name="demo.entity.Student" discriminator-value="stu">
            <property name="code"></property>
        </subclass>
        <subclass name="demo.entity.Student" discriminator-value="tea">
            <property name="jobTitle"></property>
        </subclass>
        
        
    </class>
</hibernate-mapping>

2.3 每一個類都有表,使用主鍵關聯聯繫配置spa

<?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>
    <!-- name:實體, table:表名 -->
    <!-- 使用一張表表示全部繼承體系下的類的屬性的並集,使用<discriminator>-->
    <class name="demo.entity.Person" table="ex_person">
        <!-- name:主鍵的名字,column:主鍵數據庫表列,identity自增 -->
        <id name="Id">
            <!-- 生成主鍵-->
            <generator class="uuid"></generator>
        </id>
        <!-- name:實體中的屬性名,length:長度 ,column:表中的字段(實體屬性和字段一致可省略),type:類型(可不寫由hiberbate自動匹配) -->
        <property name="name" />
        
        <joined-subclass name="demo.entity.Student" table="ex_student">
            <!-- 對應學生表的主鍵Id -->
            <key column="stuid"></key>
            <property name="code"></property>
        </joined-subclass>
        <joined-subclass name="demo.entity.Teacher" table="ex_teacher">
            <!-- 對應學生表的主鍵Id -->
            <key column="teaid"></key>
            <property name="jobTitle"></property>
        </joined-subclass>
    </class>
</hibernate-mapping>

三、 測試數據.net

package demo.test;

import org.hibernate.classic.Session;

import demo.entity.Person;
import demo.entity.Teacher;
import demo.entity.Student;
import demo.util.HibernateUtil;

public class TestSave {

    public static void main(String[] args) {

        Session session =  HibernateUtil.getCurrentSession();
        session.beginTransaction();
        
        Student student = new Student();
        student.setName("Don");
        student.setCode("091449");
        
        Teacher teacher = new Teacher();
        teacher.setName("張三");
        teacher.setJobTitle("高級教師");
        
        session.save(student);
        session.save(teacher);
        
        //查詢(查詢學生姓名,有繼承關係未指定學生對象,使用其父對象查詢)
        Person person =(Person)session.get(Person.class, "2c918c7b5b5c1adc015b5c1ae1cb0001");
        System.out.println(person.getName());
        System.out.println(person.getClass().getName());
        
        session.getTransaction().commit();

    }

}
View Code
相關文章
相關標籤/搜索