`

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

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

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

这种方式的缺陷:每次增加一个子类都要改动表结构!!而且,增加的字段不能有非空约束

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'



!!!!!!!!!!!体现出多态效果!!!!!!!!
分享到:
评论

相关推荐

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    hibernate中文参考文档

    8. 继承映射:Hibernate支持不同类型的继承映射策略,包括单表策略、每个具体类策略和类表策略。文档将详细介绍这些策略及其适用场景。 9. 操作持久化数据:包括如何使用Hibernate API来增加、删除、修改和查询...

    hibernate_-annotations_中文帮助文档

    通过`@Entity`注解标记一个Java类为实体Bean,`@Table`注解定义对应的数据库表。 - **乐观锁定版本控制** 通过`@Version`注解实现乐观锁,用于并发控制。 - **映射简单属性** 使用`@Column`注解映射字段到表的...

    hibernate3.2中文文档(chm格式)

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助...

    Hibernate+中文文档

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     12.1 继承关系树的每个具体类对应一个表  12.1.1 创建映射文件  12.1.2 操纵持久化对象  12.2 继承关系树的根类对应一个表  12.2.1 创建映射文件  12.2.2 操纵持久化对象  12.3 继承关系树的每个类对应一个...

    HibernateAPI中文版.chm

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助...

    hibernate annotation帮助文档

    - **系统需求**:在开始创建一个支持 Hibernate 注解的项目之前,需要确保满足以下系统需求: - Java 开发环境(例如 JDK 1.8 或更高版本)。 - Hibernate 相关库文件(如 hibernate-core 和 hibernate-...

    Hibernate中文详细学习文档

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助...

    Hibernate 中文 html 帮助文档

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...

    gradle多模块开发

    在多模块项目中,Gradle支持传递性依赖,这意味着如果你在一个模块中声明了对某个库的依赖,其他依赖这个模块的模块将自动获得这个依赖,无需再次声明。 Spring框架常与Gradle结合使用,特别是在实现Model-View-...

    Hibernate_3.2.0_符合Java习惯的关系数据库持久化

    5.3. 多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助...

    最全Hibernate 参考文档

    1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory ...

    Hibernate教程

    1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class 2.2.2. 映射文件 2.2.3. Hibernate配置 2.2.4. 用Ant...

    ssh(structs,spring,hibernate)框架中的上传下载

     第3~9行定义了一个数据源,其实现类是apache的BasicDataSource,第11~25行定义了Hibernate的会话工厂,会话工厂类用Spring提供的LocalSessionFactoryBean维护,它注入了数据源和资源映射文件,此外还通过一些键值...

    hibernate 体系结构与配置 参考文档(html)

    多次映射同一个类 5.4. SQL中引号包围的标识符 5.5. 其他元数据(Metadata) 5.5.1. 使用 XDoclet 标记 5.5.2. 使用 JDK 5.0 的注解(Annotation) 5.6. 数据库生成属性(Generated Properties) 5.7. 辅助数据库...

    Hibernate3+中文参考文档

    1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. 架构(Architecture) 2.1. 概况(Overview) 2.2. 实例状态 2.3. JMX整合 2.4. 对JCA的支持 3. 配置 3.1. 可编程的配置方式 3.2. 获得SessionFactory ...

Global site tag (gtag.js) - Google Analytics