Hibernate--繼承對映
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>
生成的表結構:
相關文章
- EF7繼承對映繼承
- Hibernate--單表對映總結
- [非專業翻譯] Mapster - 對映配置繼承繼承
- odoo 繼承(owl繼承、web繼承、view繼承)Odoo繼承WebView
- 菱形繼承,虛繼承繼承
- 原型,繼承——原型繼承原型繼承
- 多繼承 與 多重繼承繼承
- Javascript繼承2:建立即繼承—-建構函式繼承JavaScript繼承函式
- Javascript繼承4:潔淨的繼承者—-原型式繼承JavaScript繼承原型
- 繼承繼承
- python:super()對多繼承的影響Python繼承
- C++中公有繼承、保護繼承、私有繼承的區別C++繼承
- day23:單繼承&多繼承&菱形繼承&__init__魔術方法繼承
- 類的繼承_子類繼承父類繼承
- JavaScript繼承JavaScript繼承
- javascript:繼承JavaScript繼承
- python繼承Python繼承
- JavaScript 繼承JavaScript繼承
- 10 #### 繼承繼承
- python 繼承Python繼承
- 多繼承繼承
- python 基礎之繼承、重寫、多繼承Python繼承
- 什麼是繼承?Python繼承的特徵有哪些?繼承Python特徵
- JavaScript 各種繼承方式優缺點對比JavaScript繼承
- Javascrip—繼承(10)Java繼承
- JavaScript class 繼承JavaScript繼承
- JavaScript extends 繼承JavaScript繼承
- javascript之繼承JavaScript繼承
- 粗談繼承繼承
- 原型和繼承原型繼承
- 類的繼承繼承
- 繼承那些事繼承
- Swift-繼承Swift繼承
- C++繼承C++繼承
- C# 繼承C#繼承
- 繼承問題繼承
- PostgreSQL 表繼承SQL繼承
- 繼承那些坑繼承
- js之繼承JS繼承