hibernate映射继承关系的第三种方式:
继承关系的每个类对应一张表,在关系数据模型中用外键参照关系来表示继承关系。
其实就是 父类的属性存在一张表中,子类的属性存在另外一张表中,那么如何维护子类和父类的关系呢,在子类的表中有一个外键字段引用了父类。
如下的表结构:
employee表(父类(employee)的属性存放在employee表中):
houremployee表(HourEmployee类独有的属性存放在这,外键employee_id用来说明他对应employee表中哪一条数据):
salaryemployee表(SalaryEmployee类独有的属性存放在这,外键employee_id用来说明他对应employee表中哪一条数据):
我们看看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>
<property name="name" type="java.lang.String">
<column name="name" length="20" />
</property>
<joined-subclass name="com.shizhan.po.SalaryEmployee" table="salaryemployee">
<key column="employee_id"/>
<property name="salary" column="salary" type="double"/>
</joined-subclass>
<joined-subclass name="com.shizhan.po.HourEmployee" table="houremployee">
<key column="employee_id"/>
<property name="rate" column="rate" type="double"/>
</joined-subclass>
</class>
</hibernate-mapping>
<joined-subclass>用来指明Employee类的子类
<key>用来定义子类对应的表中外键字段的名称
<property>用来定义类自己独有的属性。
看看hibernate帮助我们生成的建表语句:
create table SCOTT.employee (
id number(19,0) not null,
name varchar2(20 char),
primary key (id)
)
create table houremployee (
employee_id number(19,0) not null,
rate double precision,
primary key (employee_id)
)
create table salaryemployee (
employee_id number(19,0) not null,
salary double precision,
primary key (employee_id)
)
alter table houremployee
add constraint FKA281B892FF6D415D
foreign key (employee_id)
references SCOTT.employee
alter table salaryemployee
add constraint FKA4104678FF6D415D
foreign key (employee_id)
references SCOTT.employee
这个建表语句符合之前的预期的想法。
Employee类:
package com.shizhan.po;
public class Employee {
private Long id ;
private String name ;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
HourSalary类:
package com.shizhan.po;
public class HourEmployee extends Employee{
private double rate ;
public double getRate() {
return rate;
}
public void setRate(double rate) {
this.rate = rate;
}
}
SalaryEmployee类:
package com.shizhan.po;
public class SalaryEmployee extends Employee{
private double salary ;
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}