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