Hibernate对继承关系的对象的处理分为多种形式:
第一种:继承链上的所有对象存放在一个表中
[color=red]这种方式的缺陷:每次增加一个子类都要改动表结构!!而且,增加的字段不能有非空约束[/color]
domain对象:
映射文件:
测试代码:
执行的sql语句:
查询的时候,不论你查询的是父类还是子类,都可以使用:
输出的语句
!!!!!!!!!!!体现出多态效果!!!!!!!!
第一种:继承链上的所有对象存放在一个表中
[color=red]这种方式的缺陷:每次增加一个子类都要改动表结构!!而且,增加的字段不能有非空约束[/color]
domain对象:
public class Employee {
private Integer id;
private String name;
public Employee(){}
public Employee(String name){
this.name = name;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class Skiller extends Employee {
private String skill;
public Skiller(){}
public Skiller(String name,String skill){
super(name);
this.skill = skill;
}
public String getSkill() {
return skill;
}
public void setSkill(String skill) {
this.skill = skill;
}
}
public class Driver extends Employee {
private Integer driverYears;
public Driver(){}
public Driver(String name,Integer driverYears){
super(name);
this.driverYears = driverYears;
}
public Integer getDriverYears() {
return driverYears;
}
public void setDriverYears(Integer driverYears) {
this.driverYears = driverYears;
}
}
映射文件:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="cn.itcast.hibernate.inherit1">
<class name="Employee" table="employee" discriminator-value="0">
<id name="id" unsaved-value="-1">
<generator class="native" />
</id>
<discriminator column="type" type="string"/>
<property name="name"/>
<subclass name="Skiller" discriminator-value="1">
<property name="skill"/>
</subclass>
<subclass name="Driver" discriminator-value="2">
<property name="driverYears"/>
</subclass>
</class>
</hibernate-mapping>
测试代码:
public static void main(String[] args) {
Session session = HibernateUtil.getSession();
Transaction tx = session.beginTransaction();
Employee employee = new Employee("employee name");
Skiller skiller = new Skiller("skiller name","play game");
Driver driver = new Driver("driver name",30);
session.save(employee);
session.save(skiller);
session.save(driver);
tx.commit();
session.close();
}
执行的sql语句:
Hibernate: insert into employee (name, type) values (?, '0')
Hibernate: insert into employee (name, skill, type) values (?, ?, '1')
Hibernate: insert into employee (name, driverYears, type) values (?, ?, '2')
查询的时候,不论你查询的是父类还是子类,都可以使用:
Employee employee = (Employee)session.get(Employee.class, 3);
System.out.println(employee.getName());
Employee employee = (Employee)session.get(Driver.class, 3);
System.out.println(employee.getName());
输出的语句
Hibernate:
select
driver0_.id as id0_0_,
driver0_.name as name0_0_,
driver0_.driverYears as driverYe5_0_0_
from
employee driver0_
where
driver0_.id=?
and driver0_.type='2'
!!!!!!!!!!!体现出多态效果!!!!!!!!