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>
总结:
一生二,二生四,四生万象,最顶层的表适合从全局进行统计,不适合表象展现,最底层的表适合各种表象得展现,但很难掌控全局。