hibernate的繼承映射有三種:subclass、joined-subclass、union-subclass
這三種各有其能,在不能的情況能發揮不能作用。
1、subclass 一張大表
需要引入辨識者列(discriminator)
<!-- 映射Person類 -->
<class name="Person" table="person_inf7" discriminator-value="普通人">
<!-- 映射辨別屬性 -->
<id name="id" column="person_id">
<!-- 使用identity的主鍵生成器政策 -->
<generator class="identity"/>
</id>
<!-- 映射辨識者列 -->
<discriminator column="wawa" type="string"/>
<!-- 如下映射兩個基本屬性 -->
<property name="name" length="80"/>
<property name="gender"/>
<!-- 下面映射了一個元件屬性 -->
<component name="address">
<!-- 映射元件屬性的三個成員屬性 -->
<property name="detail"/>
<property name="zip"/>
<property name="country"/>
</component>
<!-- 使用subclass元素映射Person類的子類Employee -->
<subclass name="Employee" discriminator-value="雇員">
<!-- 映射兩個基本屬性 -->
<property name="title" />
<property name="salary" />
<!-- 映射N-1的關聯映射 -->
<many-to-one name="manager" column="manager_id"/>
<!-- 映射與Customer類之間的1-N關聯 -->
<set name="customers" inverse="true">
<key column="empoyee_id"/>
<one-to-many class="Customer"/>
</set>
<!-- 使用subclass元素映射Employee類的子類Manager -->
<subclass name="Manager" discriminator-value="經理">
<!-- 映射Manager類的基本屬性department -->
<property name="department"/>
<!-- 映射Manager類的關聯實體:Employee -->
<set name="employees" inverse="true">
<key column="manager_id"/>
<one-to-many class="Employee"/>
</set>
</subclass>
</subclass>
<!-- 使用subclass映射Person的Customer子類 -->
<subclass name="Customer" discriminator-value="顧客">
<!-- 映射Customer類的comments屬性 -->
<property name="comments"/>
<!-- 映射Customer和Employee的關聯關系 -->
<many-to-one name="employee" column="empoyee_id"/>
</subclass>
</class>
所有字段在一個大表裡,進行統計分析的時候,比較好用。
2、joined-subclass 父子表
使用這種政策,必須使用<key../>元素映射父子類的共有主鍵,<key../>元素映射的資料列即是主鍵列,也是外鍵列。
<!-- 映射Person類 -->
<class name="Person" table="person_inf">
<!-- 映射辨別屬性 -->
<id name="id" column="person_id">
<!-- 使用identity的主鍵生成器政策 -->
<generator class="identity"/>
</id>
<!-- 如下映射兩個基本屬性 -->
<property name="name" length="80"/>
<property name="gender"/>
<!-- 下面映射了一個元件屬性 -->
<component name="address">
<!-- 映射元件屬性的三個成員屬性 -->
<property name="detail"/>
<property name="zip"/>
<property name="country"/>
</component>
<!-- 使用joined-subclass元素映射Person類的Employee子類 -->
<joined-subclass name="Employee" table="employee_inf">
<!-- 必須使用key元素映射父子類的共有主鍵 -->
<key column="employee_id"/>
<!-- 映射Employee類的兩個普通屬性 -->
<property name="title" not-null="true"/>
<property name="salary" not-null="true"/>
<!-- 映射Employee類與Manager類之間的N-1關聯-->
<many-to-one name="manager" column="manager_id"/>
<!-- 映射Employee類與Customer類之間的1-N關聯-->
<set name="customers" inverse="true">
<key column="empoyee_id"/>
<one-to-many class="Customer"/>
</set>
<!-- 使用joined-subclass元素映射Employee類的Manager子類 -->
<joined-subclass name="Manager" table="manager_inf">
<!-- 必須使用key元素映射父子類的共有主鍵 -->
<key column="manager_id"/>
<!-- 映射Manager類的department屬性 -->
<property name="department"/>
<!-- 映射Employee類與Manager類之間的1-N關聯-->
<set name="employees" inverse="true">
<key column="manager_id"/>
<one-to-many class="Employee"/>
</set>
</joined-subclass>
</joined-subclass>
<!-- 使用joined-subclass元素映射Person類的Customer子類 -->
<joined-subclass name="Customer" table="customer_inf">
<!-- 必須使用key元素映射父子類的共有主鍵 -->
<key column="customer_id"/>
<property name="comments" not-null="true"/>
<!-- 映射Employee類與Customer類之間的1-N關聯-->
<many-to-one name="employee" column="empoyee_id"
not-null="true"/>
</joined-subclass>
</class>
一張大表不可能無限的大,大到一定程度就要生産字表
3、union-subclass 分類職能表
按列别分表,使每一個面向一個類别,即可以單獨使用,也可以關系在一起形成一張大表。
<!-- 映射Person類 -->
<class name="Person" table="person_inf">
<!-- 映射辨別屬性 -->
<id name="id" column="person_id">
<!-- 不能使用identity的主鍵生成器政策
,是以使用hilo主鍵生成器政策-->
<generator class="hilo"/>
</id>
<!-- 如下映射兩個基本屬性 -->
<property name="name" length="80"/>
<property name="gender"/>
<!-- 下面映射了一個元件屬性 -->
<component name="address">
<!-- 映射元件屬性的三個成員屬性 -->
<property name="detail"/>
<property name="zip"/>
<property name="country"/>
</component>
<!-- 使用union-subclass元素映射Person類的Employee子類 -->
<union-subclass name="Employee" table="employee_inf">
<!-- 映射Employee類的兩個普通屬性 -->
<property name="title" not-null="true"/>
<property name="salary" not-null="true"/>
<!-- 映射Employee類與Manager類之間的N-1關聯-->
<many-to-one name="manager" column="manager_id"/>
<!-- 映射Employee類與Customer類之間的1-N關聯-->
<set name="customers" inverse="true">
<key column="empoyee_id"/>
<one-to-many class="Customer"/>
</set>
<!-- 使用union-subclass元素映射Employee類的Manager子類 -->
<union-subclass name="Manager" table="manager_inf">
<!-- 映射Manager類的department屬性 -->
<property name="department"/>
<!-- 映射Employee類與Manager類之間的1-N關聯-->
<set name="employees" inverse="true">
<key column="manager_id"/>
<one-to-many class="Employee"/>
</set>
</union-subclass>
</union-subclass>
<!-- 使用union-subclass元素映射Person類的Customer子類 -->
<union-subclass name="Customer" table="customer_inf">
<property name="comments" not-null="true"/>
<!-- 映射Employee類與Customer類之間的1-N關聯-->
<many-to-one name="employee" column="empoyee_id"
not-null="true"/>
</union-subclass>
</class>
總結:
一生二,二生四,四生萬象,最頂層的表适合從全局進行統計,不适合表象展現,最底層的表适合各種表象得展現,但很難掌控全局。