继承关系:
对于pojo类,Employee中放所有员工的相同属性,不同的子类就只放子类的特有属性,子类再继承父类
如:
Employee (员工表)
Seller(员工中的销售人员) Skiller(员工中的技术人员)
对于继承关系分为四种情况:
1,当子类中的特有属性很少,可以直接建立在一张表的基础上
<class name="Employee" discriminator-value="0">
<id name="empId">
<generator class="native"/>
</id>
<!-- 这里就是相当于type,在一张表中来区分到底是哪个类型的员工,对于不同类型的员工赋予不同的标志值 -->
<discriminator column="type" type="int"/>
<property name="empName"></property>
<!-- 一张表关系 -->
<subclass name="Seller" discriminator-value="1"> //放在id标签的后面
<property name="sellNum"></property>
</subclass>
<subclass name="Skiller" discriminator-value="2">
<property name="skill"></property>
</subclass>
</class>
在数据中只会出现一张表与之对应,操作的时候效率较高,但是会出现很多的空字段,这个不符合关系数据的要求
2,对于子类的特有属性比较多,需要每个子类都对应着一张表,如果全部放着一张表中就会有太多的字段
<class name="Employee">
<id name="empId">
<generator class="native"/>
</id>
<property name="empName"></property>
<joined-subclass name="Seller" table="seller">
<!-- 这个外键名字是seller表中的主键,值和Employee中的id相同 -->
<key column="emp_id"/>
<property name="sellNum"></property>
</joined-subclass>
<joined-subclass name="Skiller" table="skiller">
<key column="emp_id"/>
<property name="skill"></property>
</joined-subclass>
</class>
对于此种映射,不需要写区别的列了 discrimination了,用的是外键,但是对于每个子类都必须要对应着一张表,如果子类很多的话,就会出现很多的表
3,对于有些子类的字段很多,但是有些子类的字段很少的情况下,可以综合上面的两种解决办法
<class name="Employee" discriminator-value="0">
<id name="empId">
<generator class="native"/>
</id>
<discriminator column="type" type="int"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"></property>
</subclass>
<subclass name="Seller" discriminator-value="2">
<join table="seller"> //注意这里跟joined-subclass的区别
<key column="emp_id"/> //通过外键
<property name="sellNum"/>
</join>
</subclass>
</class>
4,对于每个子类对应着一个完整的表,把父类中的公共属性也加入到每个子类的数据库中的字段中
<class name="Employee" abstract="true">
<!-- 这里如果不设置为抽象的话,在union-subclass配置下会产生一个employee表-->
<id name="empId">
<!--因为empId不能相同,所以每个表在生成主键的时候不能生成相同的主键,因为hibernate通过主键来找记录,只能是唯一的-->
<generator class="hilo"/>
</id>
<union-subclass name="Seller" table="seller">
<property name="sellNum"></property> <!-- 每个子类的特有属性 -->
</union-subclass>
<union-subclass name="Skiller" table="skiller">
<property name="skill"></property>
</union-subclass>
</class>