hibernate映射继承关系的第二种方式:
继承关系树的根类 对应一个表:对关系数据模型进行非常规设计,在数据库表中加入额外的字段区分子类型的字段。通过这种方式,可以使关系数据模型支持继承关系和多态。
还是之前的Employee(子类),SalaryEmployee,HourEmployee。
通过这种方式配置继承关系,只需要一个配置文件,Employee.hbm.xml
先看看这个配置文件:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.shizhan.po.Employee" table="employee" schema="SCOTT">
<id name="id" type="java.lang.Long">
<column name="id" precision="10" scale="0" />
<generator class="increment" />
</id>
<discriminator column="employee_type" type="string"/>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<subclass name="com.shizhan.po.SalaryEmployee" discriminator-value="se">
<property name="salary" column="salary" type="double"></property>
</subclass>
<subclass name="com.shizhan.po.HourEmployee" discriminator-value="he">
<property name="rate" column="rate" type="double"></property>
</subclass>
</class>
</hibernate-mapping>
我们必须为表增加一个字段employee_type来区分是哪种具体Employee类型。
subclass用来告诉hibernate,哪个类有哪些具体的属性。
类文件和之前的一样。
我们看看创建表的ddl语句。
create table SCOTT.employee (
id number(19,0) not null,
employee_type varchar2(255 char) not null,
name varchar2(20 char),
salary double precision,
rate double precision,
primary key (id)
)
employee_type字段用来区分到底是哪种类型,如Employee,SalaryEmployee,HourEmployee类型。在这种表中必须允许一些字段为空,如rate不在SalaryEmployee,那么应该允许其为空。