a) 把继承层次的多个类的信息放到一张表里
b) 缺点:子类中属性的值必须是可以为空的
c) 映射文件:
<class name="Employee" table="Employee" discriminator-value="0">
<id name="id">
<generator class="native"/>
</id>
<discriminator column="type" type="int"/><!-- 定义鉴别器..要放在所有属性映射之前 -- >
<property name="name" column="name"/>
<many-to-one name="depart" column="depart_id"/>
<subclass name="Skiller" discriminator-value="1"><!—用subclass映射子类,指定鉴别字段值-->
<property name="skill"/><!—映射本子类的属性-->
</subclass>
<subclass name="Sales" discriminator-value="2">
<property name="sell"/>
</subclass>
</class>
2、 每个子类一张表
a) 把对象模型上的继承关系表示为关系模型中的外键关联,继承结构中的每个类和子类都有一张对应的数据库表,
b) 这种映射在父类对应的数据库表中,实际上会存储所有的记录,包括父类和子类的记录,在子类对应的数据库表中,这个表只存储子类中所有特有的属性要映射的字段值,子类和父类,通过相同的主键来关联
<class name="Employee" table="employee">
<id name="id">
<generator class="native"/>
</id>
<property name="name" column="name"/>
<many-to-one name="depart" column="depart_id"/>
<joined-subclass name="Skiller" table="skiller"> 子类映射。相当于一个join连接 每个子类一张表。存放子类特有的信息
<key column="employee_id"/>用key元素来指定子类和父类之间是通过那个字段来关联的
<property name="skill"/>映射的本子类属性
</joined-subclass>
<joined-subclass name="Sales" table="sales">
<key column="employee_id"/>
<property name="sell"/>
</joined-subclass>
</class>
3、 每个具体类一张表:
a) 每个具体类对应一张表,而且这个比爱哦的信息是完备的,他包含所有从父类继承下来的属性映射的字段和自己的属性映射的字段,
<class name="Employee" table="employee">
<id name="id">
<generator class="hilo"/><!-- 高低位... 主键生成器 -->
</id>
<property name="name" column="name"/>
<many-to-one name="depart" column="depart_id"/>
<!—用union-subclass元素给 每个具体子类映射到一张表-->
<union-subclass name="Skiller" table="skiller">
<property name="skill"/>映射本子类属性
</union-subclass>
<union-subclass name="Sales" table="sales">
<property name="sell"></property>
</union-subclass>
</class>
4、 继承映射方案的选择;
a) 如果不需要多态查询:使用每一张具体类一张表
b) 一定要使用多态查询:子类中的属性相对较少,使用每个继承层次一张表
c) 子类中属性较多:使用每个子类一张表
d) 简单的问题一般选择每个继承层次一张表,复杂的一半选择每个子类一张表