- 浏览: 1247403 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (193)
- ant/maven (6)
- algorithm (5)
- tomcat/weblogic/jboss (6)
- javascript/jquery (13)
- java (33)
- flex/flash (0)
- JPA/Hibernate/myBatis (18)
- java concurrent (7)
- test (2)
- windows/linux (6)
- java collection (7)
- design pattern (2)
- life/health (3)
- database (12)
- IDE (4)
- spring/ejb (20)
- html/css/ckeditor (7)
- jsp/servlet (3)
- java io (13)
- java security (4)
- jni (0)
- svn/git (2)
- english (2)
- java jmx (1)
- xml (1)
- struts/springmvc (9)
- middleware (2)
- cache (1)
- cglib (3)
最新评论
-
jlotusYo:
博主,真感谢。
Java 密码扩展无限制权限策略文件 -
senninha:
这个。。是api说明吧。。
ScheduledExecutorService 源码分析 -
zoutao2008:
请问大文件如何处理?按你这种方式的话,文件超过200M时就会报 ...
hessian系列之二:上传文件 -
lwj1113:
lwj1113 写道谢谢博主这么细致的demo;在系列五中通过 ...
myBatis系列之五:与Spring3集成 -
lwj1113:
谢谢博主这么细致的demo;在系列五中通过testng测试类跑 ...
myBatis系列之五:与Spring3集成
以Department和Employee实体为例。Developer和Tester都继承Employee。
Department类和Employee类和映射的声明:
Hibernate 多对一关联配置
Developer类:
Tester类:
1. 整个继承关系映射到一张表(single-table-per-hierarchy)
优点:不管是查询父类还是子类,只需要查询一张表,性能比较好。
缺点:扩展性不好,当需要增加子类或者属性,我们需要往表中增加字段,很多字段都空置,不符合面向对象编程的思想。
修改Employee.hbm.xml
2. 每个类映射到一个表(joined-subclass)
每个子类实例的数据会放在两张表里:父类表(基本属性)和子类表(子类特有的属性)
优点:父类表中没有空置的字段。
缺点:查询子类数据需要连表查询(父类表和子类表),效率不高。
适合:子类较少,每个子类的属性都各不相同。
修改Employee.hbm.xml:
3. 鉴别器和内联器结合
充分利用1和2的优点
Employee.hbm.xml:
4. 每个具体类映射一张独立表(union-subclass)
和2不同,这里子类的所有属性(包括从父类继承的)会保存到一张独立的表中。
Employee.hbm.xml:
这里的id生成器用的是hilo(或uuid)。
native(mysql里是自动增长)方式不可以:
id值会重复。
如Employee, Developer和Tester三张独立的表,每张表的id都是从1开始自增长的。
当查询id为1的Employee的时候,会查询到3个对象。
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个对象。
发表评论
-
myBatis系列之七:事务管理
2014-04-01 15:36 104028myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之八:分页查询
2014-01-13 22:07 0分页查询:物理分页,不是内存分页: 1. 在sql语句中指定 ... -
myBatis系列之六:与SpringMVC集成
2013-12-26 13:33 5952myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之五:与Spring3集成
2013-12-09 14:31 5043myBatis系列之一:搭建开 ... -
myBatis系列之四:关联数据的查询
2013-12-08 13:36 9765myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之三:增删改查
2013-12-01 22:36 5090myBatis系列之一:搭建开发环境 myBatis系列之二: ... -
myBatis系列之二:以接口方式交互数据
2013-11-25 22:46 12421myBatis系列之一:搭建开发环境 myBatis系列之三: ... -
myBatis系列之一:搭建开发环境
2013-11-18 22:00 8596myBatis系列之二:以接口方式交互数据 myBatis系列 ... -
JPA 一对一关联
2012-08-18 17:12 3272在一对一关联中,JPA没有规定谁为关系的维护方,OneToOn ... -
Hibernate 集合类型使用
2012-08-11 18:31 1374为了映射实体中的集合 ... -
Hibernate 组件关联关系
2012-08-11 15:10 1297实体关联的属性是个复杂类型的持久化类,但不是实体:数据库中没有 ... -
Hibernate 一对多关联配置
2012-08-09 22:13 1881以Department和Employee为例。 Depart ... -
Hibernate 多对一关联配置
2012-08-08 21:51 28349实体是Employee和Department,它们之间是多对一 ... -
Hibernate 查询分析
2012-08-08 19:15 0private void fireLoad(LoadEv ... -
Hibernate 配置文件
2012-07-25 20:17 0<properties> < ... -
jdbc 批处理操作
2012-05-15 15:43 1457jdbc的批处理操作是指把一组SQL语句(增删改操作)一次性提 ... -
jdbc调用postgreSQL数据库内置函数
2012-05-08 16:02 31621. current_timestamp 返回的是当前的 ... -
构建Hibernate项目
2012-04-25 20:35 01. 新建一个Java Project 2. 添加hiber ... -
乐观锁与悲观锁
2012-04-24 22:50 2816悲观锁: 读取数据的时候对记录加锁,直到提交数据更新后解锁 ... -
Hibernate映射文件的配置
2012-04-20 22:21 01. type值不是指java类型或者数据库的类型,而是Hib ...
相关推荐
在映射这些继承关系时,我们需要在Hibernate的配置文件或注解中指定继承策略。例如,使用XML配置,我们可以在`<class>`标签下添加`<inheritance>`子标签,指定`strategy`属性为相应的继承策略。如果是使用注解,我们...
在"javaII-8"这个压缩包文件中,很可能包含了实现Hibernate继承映射和C3P0连接池配置的源代码示例。这些代码可能包括实体类定义、映射文件(如.hbm.xml或使用注解的类)、Hibernate配置文件(hibernate.cfg.xml)...
标题:“Hibernate继承关系映射.pdf” 描述:“简明扼要地介绍了Hibernate中继承关系的映射方式,深入探讨了三种不同的映射策略及其优缺点,同时解析了多态查询的概念。” 知识点: ### Hibernate继承关系映射...
以下是对"jpa/hibernate继承注解"这一主题的详细说明。 1. **单一表继承(Single Table Inheritance, STI)** 单一表继承是最简单的继承策略,所有的子类信息都存储在一个数据库表中。使用`@Inheritance(strategy ...
Hibernate,作为Java中广泛使用的对象关系映射(ORM)框架,提供了多种方式来处理继承关系的映射,其中一种就是"每个类都对应一张表"的策略。本文将深入探讨这种映射方式,以及如何在Hibernate中实现它。 首先,...
在Hibernate中配置类继承关系,我们需要在实体类上使用`@Inheritance`注解,并指定继承策略。例如,使用单表继承: ```java @Entity @Inheritance(strategy = InheritanceType.SINGLE_TABLE) @DiscriminatorColumn...
NULL 博文链接:https://prowl.iteye.com/blog/519618
Hibernate继承映射是将Java类的继承关系映射到数据库表的一种策略,使得对象模型的复杂性能够平滑地转化为关系数据库模型。本篇将详细介绍Hibernate继承映射的第一种策略——每棵类继承树对应一张表,即单一表继承...
Hibernate继承映射是将Java中的继承关系映射到数据库的关系模型中。在Java中,一个基类可以有多个子类,而在数据库中,这些子类可以共享一张表或者各自拥有独立的表,这取决于我们选择的继承策略。Hibernate提供了四...
在实现时,需要确保配置文件(如hibernate.cfg.xml)的正确设置,并在实体类中使用对应的注解或XML配置来指定继承关系。通过这种方式,Hibernate能够自动处理对象与数据库间的转换,简化开发工作。
而Hibernate则是一个ORM(对象关系映射)框架,它简化了数据库操作,使开发者可以专注于业务代码而不是SQL。 **Spring框架** Spring是Java企业版(Java EE)开发中的关键组件,它的核心特性包括依赖注入(DI)和...
本文将深入探讨使用注解配置的Hibernate继承映射策略,尤其是单表继承策略。 **一、Hibernate继承映射类型** 1. **单表继承(Single Table Inheritance)** - 这种策略将所有继承类的数据存储在一个单一的表中,...
在实现这种映射时,我们需要在Hibernate的配置文件(hibernate.cfg.xml或相应的注解)中指定继承关系。例如,我们有一个抽象基类`Person`和两个子类`Student`和`Teacher`,可以这样配置: ```xml <hibernate-...
Hibernate 4的配置文件格式基本继承自早期版本,但进行了适度的更新以支持新的特性。在hibernate.cfg.xml文件中,是一个核心标签,它包含了一系列属性标签,用于定义Hibernate与数据库连接的各种参数,如数据库连接...
类的继承关系,如`Son`继承自`Father`。在Hibernate中,这种关系不需要特别的映射,因为Java的继承机制已经处理了对象间的层级关系。 9. **实现(Implementation)**: 类实现接口,如`BaseDAO`实现`IOperator`...
5. **查询操作**:Hibernate提供了一些API和HQL(Hibernate Query Language)来方便地处理这种继承关系的查询,如`Session.get()`或`Session.createQuery()`。 通过以上步骤,我们可以成功地在数据库中实现基于...
### 常用Hibernate映射配置详解 #### 1. hibernate-mapping节点解析 `hibernate-mapping`节点是Hibernate映射文件中的顶级节点,用于定义一系列配置选项,控制整个映射文件的行为和映射规则。这些配置包括数据库...