Hibernate:类继承的实现方式(一)--父子类在同一个表中

Hibernate对继承关系的对象的处理分为多种形式:

第一种:继承链上的所有对象存放在一个表中

[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'



!!!!!!!!!!!体现出多态效果!!!!!!!!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值