这种映射方式只需为继承关系树的Employee根类创建一张表EMPLOYEES如图所示在EMPLOYEES表中不仅提供和Employee类的属性对应的字段还要提供和它的两个子类的所有属型对应的字段此外EMPLOYEES表中需要额外加入一个字符串类型的EMPLOYEE_TYPE字段用于区分Employee的具体类型
图 继承关系树的根类对应一个表Company类和Employee类有相应的映射文件而HourlyEmployee类和SalariedEmployee类没有相应的映射文件图显示了持久化类映射文件和数据库表之间的对应关系
图 持久化类映射文件和数据库表之间的对应关系 创建映射文件
从Company类到Employee类是多态关联由于关系数据模型描述了Employee类和它的两个子类的继承关系因此可以映射Company类的employees集合例程是Companyhbmxml文件的代码该文件不仅映射了Company类的id和name属性还映射了它的employees集合
例程 Companyhbmxml
<hibernatemapping >
<class name=mypackCompany table=COMPANIES >
<id name=id type=long column=ID>
<generator class=increment/>
</id>
<property name=name type=stringcolumn=NAME />
<set
name=employees
inverse=true
lazy=true >
<key column=COMPANY_ID />
<onetomany class=mypackEmployee />
</set>
</class>
</hibernatemapping>
Employeehbmxml文件用于把Employee类映射到EMPLOYEES表在这个映射文件中除了需要映射Employee类本身的属性还需要在元素中映射两个子类的属性例程是Employeehbmxml文件的代码
例程 Employeehbmxml
<hibernatemapping >
<class name=mypackEmployee table=EMPLOYEES>
<id name=id type=long column=ID>
<generator class=increment/>
</id>
<discriminator column=EMPLOYEE_TYPE type=string/>
<property name=name type=string column=NAME />
<manytoone
name=company
column=COMPANY_ID
class=mypackCompany
/>
<subclass name=mypackHourlyEmployee discriminatorvalue=HE >
<property name=rate column=RATE type=double />
</subclass>
<subclass name=mypackSalariedEmployee discriminatorvalue=SE >
<property name=salary column=SALARY type=double />
</subclass>
</class>
</hibernatemapping>
在Employeehbmxml文件中元素指定EMPLOYEES表中用于区分Employee类型的字段为EMPLOYEE_TYPE两个元素用于映射HourlyEmployee类和SalariedEmployee类元素的discriminatorvalue属性指定EMPLOYEE_TYPE字段的取值EMPLOYEES表中有以下记录
educitycn/img_///jpg >