一、Hibernate的继承映射包含了三种基本的继承映射策略:
二、假设我们有三个类Animal,Pig,Bird
public class Pig extends Animal { private int weight; //setter and getter }
public class Bird extends Animal { private int height; //setter and getter }
* 父类用普通的<class>标签定义。
* 在父类中定义一个discriminator,即指定这个区分的字段的名称和类型
如:<discriminator column=”XXX” type=”string”/>
* 子类使用<subclass>标签定义。
* 采用这种策略只需要一张表即可。它有一个很大的限制:要求那些由子类定义的字段不能有非空(NOT NULL)约束。
具体配置:
Animal.hbm.xml: <class name="Animal" table="t_animal" lazy="false"> <id name="id"> <generator class="native"/> </id> <discriminator column="type" type="string"/> <property name="name"/> <property name="sex"/> <subclass name="Pig" discriminator-value="P"> <property name="weight"/> </subclass> <subclass name="Bird" discriminator-value="B"> <property name="height"/> </subclass> </class>
2.每个子类映射成一张表
* 父类用普通的<class>标签定义。
* 父类不再需要定义discriminator字段。
* 子类用<joined-subclass>标签定义。
具体配置:
extends.hbm.xml <class name="Animal" table="t_animal"> <id name="id"> <generator class="native"/> </id> <property name="name"/> <property name="sex"/> <joined-subclass name="Pig" table="t_pig"> <key column="pid"/> <property name="weight"/> </joined-subclass> <joined-subclass name="Bird" table="t_bird"> <key column="bid"/> <property name="height"/> </joined-subclass> </class>
3.每个具体类映射成一张表
* 父类用普通<class>标签定义。
* 子类用<union-subclass>标签定义。
* 注意:在保存对象的时候id是不能重复的(不能使用自增生成主键)。
具体配置:
<class name="Animal" abstract="true"> <id name="id"> <generator class="assigned"/> </id> <property name="name"/> <property name="sex"/> <union-subclass name="Pig" table="t_pig"> <property name="weight"/> </union-subclass> <union-subclass name="Bird" table="t_bird"> <property name="height"/> </union-subclass> </class>