`

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个对象。
分享到:
评论

相关推荐

    用Hibernate映射继承关系

    在映射这些继承关系时,我们需要在Hibernate的配置文件或注解中指定继承策略。例如,使用XML配置,我们可以在`&lt;class&gt;`标签下添加`&lt;inheritance&gt;`子标签,指定`strategy`属性为相应的继承策略。如果是使用注解,我们...

    Hibernate继承映射代码

    在"javaII-8"这个压缩包文件中,很可能包含了实现Hibernate继承映射和C3P0连接池配置的源代码示例。这些代码可能包括实体类定义、映射文件(如.hbm.xml或使用注解的类)、Hibernate配置文件(hibernate.cfg.xml)...

    Hibernate继承关系映射.pdf

    标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...

    jpa/hibernate继承注解

    以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...

    hibernate映射继承关系(每个类都对应一张表)

    Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...

    (2)Hibernate3.2 中的类继承关系

    在Hibernate中配置类继承关系,我们需要在实体类上使用`@Inheritance`注解,并指定继承策略。例如,使用单表继承: ```java @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn...

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

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

    Hibernate继承映射的第一种策略:每棵类继承树对应一张表

    Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...

    hibernate继承映射.rar

    Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,一个基类可以有多个子类,而在数据库中,这些子类可以共享一张表或者各自拥有独立的表,这取决于我们选择的继承策略。Hibernate提供了四...

    Hibernate映射继承关系的三种方案.docx

    在实现时,需要确保配置文件(如hibernate.cfg.xml)的正确设置,并在实体类中使用对应的注解或XML配置来指定继承关系。通过这种方式,Hibernate能够自动处理对象与数据库间的转换,简化开发工作。

    spring整合struts2与hibernate核心配置文件

    而Hibernate则是一个ORM(对象关系映射)框架,它简化了数据库操作,使开发者可以专注于业务代码而不是SQL。 **Spring框架** Spring是Java企业版(Java EE)开发中的关键组件,它的核心特性包括依赖注入(DI)和...

    Hibernate继承映射(annotation)

    本文将深入探讨使用注解配置的Hibernate继承映射策略,尤其是单表继承策略。 **一、Hibernate继承映射类型** 1. **单表继承(Single Table Inheritance)** - 这种策略将所有继承类的数据存储在一个单一的表中,...

    Hibernate继承映射二:每个子类一张表

    在实现这种映射时,我们需要在Hibernate的配置文件(hibernate.cfg.xml或相应的注解)中指定继承关系。例如,我们有一个抽象基类`Person`和两个子类`Student`和`Teacher`,可以这样配置: ```xml &lt;hibernate-...

    hibernate 4的配置和使用

    Hibernate 4的配置文件格式基本继承自早期版本,但进行了适度的更新以支持新的特性。在hibernate.cfg.xml文件中,是一个核心标签,它包含了一系列属性标签,用于定义Hibernate与数据库连接的各种参数,如数据库连接...

    hibernate中的对象关系模型

    类的继承关系,如`Son`继承自`Father`。在Hibernate中,这种关系不需要特别的映射,因为Java的继承机制已经处理了对象间的层级关系。 9. **实现(Implementation)**: 类实现接口,如`BaseDAO`实现`IOperator`...

    Hibernate ORM - 继承关联关系之union-subclass

    5. **查询操作**:Hibernate提供了一些API和HQL(Hibernate Query Language)来方便地处理这种继承关系的查询,如`Session.get()`或`Session.createQuery()`。 通过以上步骤,我们可以成功地在数据库中实现基于...

    常用 Hibernate 映射配置说明.doc

    ### 常用Hibernate映射配置详解 #### 1. hibernate-mapping节点解析 `hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库...

Global site tag (gtag.js) - Google Analytics