父类和子类分放在不同的表中,子类通过父类的id与父类关联。只有父类有配置文件,父类中通过joined-subclass标识子类.
现在有四个类Employee2、SalaryEmployee2、HourlyEmployee2,其中Employee是SalaryEmployee、HourlyEmployee的父类
类的实现代码如下:Employee2
package com.supporter.prj.bm.period_manage.entity;
public class Employee2 {
private String employeeId;
private String name;
public String getEmployeeId() {
return employeeId;
}
public void setEmployeeId(String employeeId) {
this.employeeId = employeeId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
HourlyEmployee2
public class HourlyEmployee2 extends Employee2{
private Double rate;
public Double getRate() {
return rate;
}
public void setRate(Double rate) {
this.rate = rate;
}
}
SalaryEmployee2
<span style="font-size:14px;">package com.supporter.prj.bm.period_manage.entity;
public class SalaryEmployee2 extends Employee2{
private Double salary;
public Double getSalary() {
return salary;
}
public void setSalary(Double salary) {
this.salary = salary
}
}</span>
数据库:employee2
hourlyEmployee2(没有将主键设置为外键)
salaryEmployee2(没有将主键设置为外键)
hibernate文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >
<hibernate-mapping package="com.supporter.prj.bm.period_manage.entity">
<class name="Employee2" table="bm_employee2">
<id name="employeeId" type="string" column="employee_id">
<span style="white-space:pre"> </span><generator class="assigned"/>
</id>
<property name="name" column="name" type="string" length="16"/>
<joined-subclass name = "SalaryEmployee2" table="bm_salary_employee2">
<key column = "employee_id"></key>
<property name="salary" column="salary" type="java.lang.Double" />
</joined-subclass>
<joined-subclass name = "HourlyEmployee2" table="bm_hourly_employee2">
<key column = "employee_id"></key>
<property name="rate" column="rate" type="java.lang.Double">
</property>
</joined-subclass>
</class>
</hibernate-mapping>
业务逻辑
package com.supporter.prj.bm.period_manage.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import com.supporter.prj.bm.period_manage.dao.HourlyEmployee2Dao;
import com.supporter.prj.bm.period_manage.entity.HourlyEmployee2;
public class EmployeeService {
@Autowired
private HourlyEmployee2Dao hourlyEmployeeDao;
public void gethourlyEmployee() {
/**
* hql:from HourlyEmployee2
* 包装的retrieve方法
*/
List <HourlyEmployee2> hourlyE = hourlyEmployeeDao.getAllObjects();
}
执行的sql语句:
SELECT
hourlyempl0_.employee_id AS employeeId,
hourlyempl0_1_.name AS name,
hourlyempl0_.rate AS rate
FROM
bm_hourly_employee2 hourlyempl0_,
bm_employee2 hourlyempl0_1_
WHERE
hourlyempl0_.employee_id=hourlyempl0_1_.employee_id
执行结果:
参考:
原employee2表中数据:
hourlyEmployee2表中的数据:
增加数据:
Action:
public void gethourlyEmployee(){
SalaryEmployee2 salaryEmployee = new SalaryEmployee2();
salaryEmployee.setEmployeeId("000003");
salaryEmployee.setName("hali");
salaryEmployee.setSalary(200000.0);
HourlyEmployee2 hourlyEmployee = new HourlyEmployee2();
hourlyEmployee.setEmployeeId("000004");
hourlyEmployee.setName("jexika");
hourlyEmployee.setRate(0.09);
employeeService.saveH(salaryEmployee, hourlyEmployee);
employeeService.gethourlyEmployee();
}
Service
public void saveH(SalaryEmployee2 salaryEmployee, HourlyEmployee2 hourlyEmployee) {
<span style="white-space:pre"> </span>//注释的方式和下面实现结果,执行的sql语句都一样。
//employeeDao.save(hourlyEmployee);
//employeeDao.save(salaryEmployee);
hourlyEmployeeDao.save(hourlyEmployee);
salaryEmployeeDao.save(salaryEmployee);
}
保存子类到相应的子表的同时,相应的父类数据会保存到父类表
执行结果:
执行语句:
Hibernate:
insert
into
bm_employee2
(name, employee_id)
values
(?, ?)
Hibernate:
insert
into
bm_hourly_employee2
(rate, employee_id)
values
(?, ?)
Hibernate:
insert
into
bm_employee2
(name, employee_id)
values
(?, ?)
Hibernate:
insert
into
bm_salary_employee2
(salary, employee_id)
values
(?, ?)
删除数据:
action
public void delEmployee(){
employeeService.delEmloyee();
}
Service
public void delEmloyee() {
hourlyEmployeeDao.delete("000004");
salaryEmployeeDao.delete("000003");
}
删除子表已有的数据的同时,相应的父类数据也会删除相应id的数据
执行结果
执行的sql语句:
Hibernate:
select
hourlyempl0_.employee_id as employee1_3558_0_,
hourlyempl0_1_.name as name3558_0_,
hourlyempl0_.rate as rate3560_0_
from
bm_hourly_employee2 hourlyempl0_,
bm_employee2 hourlyempl0_1_
where
hourlyempl0_.employee_id=hourlyempl0_1_.employee_id
and hourlyempl0_.employee_id=?
Hibernate:
select
salaryempl0_.employee_id as employee1_3558_0_,
salaryempl0_1_.name as name3558_0_,
salaryempl0_.salary as salary3559_0_
from
bm_salary_employee2 salaryempl0_,
bm_employee2 salaryempl0_1_
where
salaryempl0_.employee_id=salaryempl0_1_.employee_id
and salaryempl0_.employee_id=?
Hibernate:
delete
from
bm_hourly_employee2
where
employee_id=?
Hibernate:
delete
from
bm_employee2
where
employee_id=?
Hibernate:
delete
from
bm_salary_employee2
where
employee_id=?
Hibernate:
delete
from
bm_employee2
where
employee_id=?