`

Hibernate 继承关系配置

阅读更多
以Department和Employee实体为例。Developer和Tester都继承Employee。

Department类和Employee类和映射的声明:
Hibernate 多对一关联配置

Developer类:
public class Developer extends Employee {
	private String develop;

	public Developer() {
	}
	public Developer(String name) {
		super(name);
	}
	// Getters and setters are omitted


Tester类:
public class Tester extends Employee {
	private String test;
	
	public Tester(){
	}
	
	public Tester(String name) {
		super(name);
	}
	// Getters and setters are omitted
}


1. 整个继承关系映射到一张表(single-table-per-hierarchy)
优点:不管是查询父类还是子类,只需要查询一张表,性能比较好。
缺点:扩展性不好,当需要增加子类或者属性,我们需要往表中增加字段,很多字段都空置,不符合面向对象编程的思想。

修改Employee.hbm.xml
<class name="Employee" discriminator-value="0">
	<id name="id">
		<generator class="native"/>
	</id>
	<!-- 增加一个字段,以区别对应的是哪个实体 -->
	<discriminator column="type" type="string"/>
	<property name="name" length="20" not-null="true"/>
	<many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />
	
	<!-- Inheritance - Single-Table-Per-Hierarchy -->
	<subclass name="Developer" discriminator-value="3">
		<property name="develop" length="40"/>
	</subclass>
	
	<subclass name="Tester" discriminator-value="4">
		<property name="test" length="40"/>
	</subclass>
</class>


	Session s = null;
	Transaction tx = null;
	
	Department depart = new Department("FCI");
	Employee em1 = new Employee("John");
	em1.setDepartment(depart);
	Developer em2 = new Developer("Lucy");
	em2.setDepartment(depart);
	em2.setDevelop("Java");
	Tester em3 = new Tester("Lily");
	em3.setDepartment(depart);
	em3.setTest("Load runner");
	
	try {
		s = HibernateUtil.getSession();
		tx = s.beginTransaction();
		s.save(em1);
		s.save(em2);
		s.save(em3);
		tx.commit();
	} catch (HibernateException e) {
		tx.rollback();
		e.printStackTrace();
	} finally {
		s.close();
	}



2. 每个类映射到一个表(joined-subclass)

每个子类实例的数据会放在两张表里:父类表(基本属性)和子类表(子类特有的属性)
优点:父类表中没有空置的字段。
缺点:查询子类数据需要连表查询(父类表和子类表),效率不高。
适合:子类较少,每个子类的属性都各不相同。

修改Employee.hbm.xml:
<class name="Employee">
	<id name="id">
		<generator class="native"/>
	</id>
	<property name="name" length="20" not-null="true"/>
	<many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />
	
	<!-- Inheritance -->
	<joined-subclass name="Developer">
		<key column="develop_id" foreign-key="id"/>
		<property name="develop" length="40"/>
	</joined-subclass>
	<joined-subclass name="Tester">
		<key column="test_id" foreign-key="id"/>		
		<property name="test" length="40"/>
	</joined-subclass>
</class>
</hibernate-mapping>



3. 鉴别器和内联器结合

充分利用1和2的优点

Employee.hbm.xml:
<hibernate-mapping package="com.john.myhibernate.domain">

<class name="Employee" discriminator-value="0">
	<id name="id">
		<generator class="native"/>
	</id>
	<discriminator column="type" type="string"/>
	<property name="name" length="20" not-null="true"/>
	<many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />
	
	<!-- Inheritance -->
	<subclass name="Developer" discriminator-value="3">
		<property name="develop" length="40"/>
	</subclass>
	<subclass name="Tester" discriminator-value="4">
		<join table="my_tester">
			<key column="test_id" foreign-key="id"/>
			<property name="test" length="40"/>
		</join>
	</subclass>	
</class>
</hibernate-mapping>



4. 每个具体类映射一张独立表(union-subclass)

和2不同,这里子类的所有属性(包括从父类继承的)会保存到一张独立的表中。

Employee.hbm.xml:
<class name="Employee">
	<id name="id">
		<generator class="hilo"/>
	</id>
	<property name="name" length="20" not-null="true"/>
	<many-to-one name="department" column="depart_id" cascade="save-update" fetch="join" lazy="no-proxy" />
	
	<!-- Inheritance -->
	<union-subclass name="Developer" table="developer">
		<property name="develop" length="40"/>
	</union-subclass>
	<union-subclass name="Tester" table="tester">
		<property name="test" length="40"/>
	</union-subclass>	
</class>
</hibernate-mapping>

这里的id生成器用的是hilo(或uuid)。
native(mysql里是自动增长)方式不可以:
id值会重复。
如Employee, Developer和Tester三张独立的表,每张表的id都是从1开始自增长的。
当查询id为1的Employee的时候,会查询到3个对象。
分享到:
评论

相关推荐

    Spring+JPA(hibernate)整合 一对多及继承关系配置

    NULL 博文链接:https://prowl.iteye.com/blog/519618

    Hibernate_映射配置文件详解

    Hibernate_映射配置文件详解,个人觉的比较不错的关于hibernate讲解的ppt,对于xml配置,继承关系,多对多等关系映射讲的很详细!

    Hibernate学习资料(java)

    Hibernate一对一数据关联 Hibernate下的多对多关系 Hibernate关系映射 Hibernate继承关系映射 Hibernate映射类型-主键生成器-核心API Hibernate3 插件Eclipse配置

    Hibernate 课件_配置文件详解

    这是第二篇, 内容如下:Hibernate配置文件;jdbc.fetch_size;jdbc.batch_size; POJO 类和数据库的映射文件*.hbm.xml;主键生成策略generator;映射集合属性;延迟加载策略;映射组件属性;关联关系映射:双向 1-N;继承...

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

    Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 1.3.5...

    Hibernate3.1_学习源码

    01 01Hibernate_Handwork : 手工配置使用Hibernate,其中详细标了Hibernate进行持久化的一些过程,因为是Hibernate的入门实例,所以注释很详细,其中有session的关闭后重建问题。 02 02Hibernate_UseMyEclipse: 利用...

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

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    深入hibernate配置文件

    Hibernate倡导低侵入式的设计,完全采用普通的java对象(POJO)编程,不要求PO继承Hibernate的某个超类或实现Hibernate的某个接口。Hibernate充当了面向对象的程序设计语言和关系数据库之间的桥梁,Hibernate允许程序...

    精通Hibernate之映射继承关系(六)

    Company与Employee类之间为一对多多态关联关系,如果继承关系树的根类对应一个表,或者每个类对应一个表,那么就能映射Company类的employees集合。本节介绍如何映射多对一多态关联。如图14-11所示,ClassD与ClassA为...

    Hibernate Annotations 中文文档

    2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. 多对一...

    Hibernate+中文文档

    1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 ...

    彻底解决hibernate常见难点.zip

    N关系时保存技巧、Hibernate缓存机制、Hibernate批量处理数据、Hibernate三种继承映射策略、hibernate映射体系、Hibernate主键生成策略、持久层DAO设计建议、基于xml文件的bean、使用HibernateAPI在Spring中、事务...

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

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

    hibernate annotation 中文文档

    2.2.4. 映射继承关系 2.2.4.1. 每个类一张表 2.2.4.2. 每个类层次结构一张表 2.2.4.3. 连接的子类 2.2.4.4. 从父类继承的属性 2.2.5. 映射实体Bean的关联关系 2.2.5.1. 一对一(One-to-one) 2.2.5.2. 多对一(Many-to-...

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

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    HibernateAPI中文版.chm

    HIBERNATE - 符合Java习惯的关系数据库持久化 Hibernate参考文档 3.2 -------------------------------------------------------------------------------- 目录 前言 1. 翻译说明 2. 版权声明 1. Hibernate...

    hibernate 教程

    开始Hibernate之旅 1.2. 第一个可持久化类 1.3. 映射cat 1.4. 与猫同乐 1.5. 结语 2. 体系结构 2.1. 总览 2.2. JMX集成 2.3. JCA支持 3. SessionFactory配置 3.1. 可编程配置方式...

    Hibernate实战(第2版 中文高清版)

     2.1.3 Hibernate配置和启动   2.1.4 运行和测试应用程序   2.2 启动Java Persistence项目   2.2.1 使用Hibernate Annotations   2.2.2 使用Hibernate EntityManager   2.2.3 引入EJB组件   2.2.4 切换...

    Hibernate中文详细学习文档

    1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第二部分 - 关联映射 1.3.1. 映射Person类 1.3.2. 单向Set-based的关联 1.3.3. 使关联工作 1.3.4. 值类型的集合 ...

Global site tag (gtag.js) - Google Analytics