- 浏览: 2307442 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (314)
- JAVA基础知识 (54)
- Java-IO/FIle (16)
- Java-JDBC (4)
- JAVA-新增特性-注解 (3)
- Java-枚举 (2)
- Java-泛型 (1)
- Java-多线程 (15)
- Java-XML (4)
- Java-JMS(消息服务) (4)
- Java-JVM (0)
- Web Service服务 (7)
- Jsp (10)
- js (18)
- Struts框架 (11)
- Spring框架 (29)
- Hibernate框架 (28)
- Spring Boot框架 (2)
- ExtJS前端框架 (29)
- Jquery js库 (8)
- JUnit框架 (8)
- Selenium 测试 (1)
- NoSql---Redis (6)
- ORACLE数据库 (45)
- MySQL数据库 (4)
- tomcat (3)
- Nginx反向代理服务器 (4)
- web应用服务器通用知识 (3)
- 开发工具IDE (14)
- UML建模 (1)
- SVN CVS 版本管理 (6)
- git 分布式版本管理 (4)
- 报表设计 (5)
- 文件上传下载 (2)
- 数据算法 (1)
- 存储过程 (5)
- JSON 相关 (1)
- OGNL表达式 (3)
- Util工具包 (9)
- 设计模式 (15)
- linux 相关 (3)
- life think (3)
- 工作流管理框架 (1)
- 大数据-Hadoop (1)
最新评论
-
huih:
很不错的文章
SpringMVC+Hibernate+Spring 简单的一个整合实例 -
calm01:
学习了.
Spring <bean>标签属性 Autowire自动装配(转载) -
lizhenlzlz:
我的也是拦截不了service层
SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)(转载) -
josh_123:
讲的不错,很详细,如果quartz定时任务类采用不继承任何类的 ...
Spring,jdk定时任务的几种实现以及任务线程是串行还是并行执行(转载) -
human_coder:
你知道eclipse调试怎么可以回调吗?有时候总是调快了,不能 ...
Debug---Eclipse断点调试基础
在面向对象的程序领域中,类与类之间是有继承关系的,例如Java世界中只需要extends关键字就可以确定这两个类的父子关系,但是在关系数据库的世界中,表与表之间没有任何关键字可以明确指明这两张表的父子关系,表与表是没有继承关系这样的说法的。为了将程序领域中的继承关系反映到数据中,Hibernate为我们提供了3中方案:
第一种方案:一个子类对应一张表。
第二种方案:使用一张表表示所有继承体系下的类的属性的并集。
第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。
现在假设有People、Student、Teacher三个类,父类为People,Student与Teacher为People的父类,代码如下:
People类:
- public class People
- {
- /*父类所拥有的属性*/
- private String id;
- private String name;
- private String sex;
- private String age;
- private Timestamp birthday;
- /*get和set方法*/
- }
Student类:
- public class Student extends People
- {
- /*学生独有的属性*/
- private String cardId;//学号
- public String getCardId()
- {
- return cardId;
- }
- public void setCardId(String cardId)
- {
- this.cardId = cardId;
- }
- }
Teacher类:
- public class Teacher extends People
- {
- /*Teacher所独有的属性*/
- private int salary;//工资
- public int getSalary()
- {
- return salary;
- }
- public void setSalary(int salary)
- {
- this.salary = salary;
- }
- }
第一种方案:一个子类对应一张表
该方案是使继承体系中每一个子类都对应数据库中的一张表。
示意图如下:
每一个子类对应的数据库表都包含了父类的信息,并且包含了自己独有的属性。每个子类对应一张表,而且这个表的信息是完备的,即包含了所有从父类继承下来的属性映射的字段。这种策略是使用<union-subclass>标签来定义子类的。
配置People.hbm.xml文件:(注意:这里都写在了一个People的配置文件里,也可以分别写在三个配置文件,即Student.hbm.xml、Teacher.hbm.xml里,以下同样可以)
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.suxiaolei.hibernate.pojos.People" abstract="true">
- <id name="id" type="string">
- <column name="ID"></column>
- <generator class="uuid"></generator>
- </id>
- <property name="name" column="NAME" type="string"></property>
- <property name="sex" column="SEX" type="string"></property>
- <property name="age" column="AGE" type="string"></property>
- <property name="birthday" column="BIRTHDAY" type="timestamp"></property>
- <!--
- <union-subclass name="com.suxiaolei.hibernate.pojos.Student" table="STUDENT">
- <property name="cardId" column="CARDID" type="string"></property>
- </union-subclass>
- <union-subclass name="com.suxiaolei.hibernate.pojos.Teacher" table="TEACHER">
- <property name="salary" column="SALARY" type="integer"></property>
- </union-subclass>
- -->
- </class>
- <!-- 可单独写在Student.hbm.xml里 -->
- <union-subclass name="com.suxiaolei.hibernate.pojos.Student"
- table="STUDENT" extends="com.suxiaolei.hibernate.pojos.People">
- <property name="cardId" column="CARDID" type="string"></property>
- </union-subclass>
- <!-- 可单独写在Teacher.hbm.xml里 -->
- <union-subclass name="com.suxiaolei.hibernate.pojos.Teacher"
- table="TEACHER" extends="com.suxiaolei.hibernate.pojos.People">
- <property name="salary" column="SALARY" type="integer"></property>
- </union-subclass>
- </hibernate-mapping>
以上配置是一个子类一张表方案的配置,<union-subclass>标签是用于指示出该hbm文件所表示的类的子类,如People类有两个子类,就需要两个<union-subclass>标签以此类推。<union-subclass>标签的"name"属性用于指定子类的全限定名称,"table"属性用于指定该子类对应的表的名称,"extends"属性用于指定该子类的父类,注意该属性与<union-subclass>标签的位置有关,若 <union-subclass>标签作为<class>标签的子标签,则"extends"属性可以不设置,否则需要明确设置"extends"属性。<class>标签中的"abstract"属性如果值为true则,不会生成表结构。如果值为false则会生成表结构,但是不会插入数据。
根据People.hbm.xml生成表结构:
- drop table if exists STUDENT
- drop table if exists TEACHER
- create table STUDENT (
- ID varchar(255) not null,
- NAME varchar(255),
- SEX varchar(255),
- AGE varchar(255),
- BIRTHDAY datetime,
- CARDID varchar(255),
- primary key (ID)
- )
- create table TEACHER (
- ID varchar(255) not null,
- NAME varchar(255),
- SEX varchar(255),
- AGE varchar(255),
- BIRTHDAY datetime,
- SALARY integer,
- primary key (ID)
- )
可以看到一个子类对应一张表。
第二种方案:使用一张表表示所有继承体系下的类的属性的并集
这种策略是使用<subclass>标签来实现的。因为类继承体系下会有许多个子类,要把多个类的信息存放在一张表中,必须有某种机制来区分哪些记录是属于哪个类的。Hibernate中的这种机制就是,在表中添加一个字段,用这个字段的值来进行区分。在表中添加这个标示列使用<discriminator>标签来实现。
该策略的示意图:
将继承体系中的所有类信息表示在同一张表中后,只要是这个类没有的属性会被自动赋上null。
配置People.hbm.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.suxiaolei.hibernate.pojos.People" table="PEOPLE">
- <id name="id" type="string">
- <column name="ID"></column>
- <generator class="uuid"></generator>
- </id>
- <discriminator column="PEOPLETYPE" type="string"></discriminator>
- <property name="name" column="NAME" type="string"></property>
- <property name="sex" column="SEX" type="string"></property>
- <property name="age" column="AGE" type="string"></property>
- <property name="birthday" column="BIRTHDAY" type="timestamp"></property>
- <subclass name="com.suxiaolei.hibernate.pojos.Student" discriminator-value="student">
- <property name="cardId" column="CARDID" type="string"></property>
- </subclass>
- <subclass name="com.suxiaolei.hibernate.pojos.Teacher" discriminator-value="teacher">
- <property name="salary" column="SALARY" type="string"></property>
- </subclass>
- </class>
- </hibernate-mapping>
<discriminator>标签用于在表中创建一个标识列,其"column"属性指定标识列的列名,"type"指定了标识列的类型。<subclass>标签用于指定该HBM文件代表类的子类,有多少子类就有多少个该标签,其"name"属性指定子类的名称,"discriminator-value"属性指定该子类的数据的标识列的值是什么,其"extends"属性与<union-subclass>的"extends"属性用法一致。
根据People.hbm.xml生成表结构:
- drop table if exists PEOPLE
- create table PEOPLE (
- ID varchar(255) not null,
- PEOPLETYPE varchar(255) not null,
- NAME varchar(255),
- SEX varchar(255),
- AGE varchar(255),
- BIRTHDAY datetime,
- CARDID varchar(255),
- SALARY varchar(255),
- primary key (ID)
- )
可以看到一张表将继承体系下的所有信息都包含了,其中"PEOPLETYPE"为标识列。
第三种方案:每个子类使用一张表只存储它特有的属性,然后与父类所对应的表以一对一主键关联的方式关联起来。
这种策略是使用<joined-subclass>标签来定义子类的。父类、子类都对应一张数据库表。在父类对应的数据库表中,它存储了所有记录的公共信息,实际上该父类对应的表会包含所有的记录,包括父类和子类的记录;在子类对应的数据库表中,这个表只定义了子类中所特有的属性映射的字段。子类对应的数据表与父类对应的数据表,通过一对一主键关联的方式关联起来。
这种策略的示意图:
people表中存储了子类的所有记录,但只记录了他们共有的信息,而他们独有的信息存储在他们对应的表中,一条记录要获得其独有的信息,要通过people记录的主键到其对应的子表中查找主键值一样的记录然后取出它独有的信息。
配置People.hbm.xml:
- <?xml version="1.0" encoding="utf-8"?>
- <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mapping>
- <class name="com.suxiaolei.hibernate.pojos.People" table="PEOPLE">
- <id name="id" type="string">
- <column name="ID"></column>
- <generator class="uuid"></generator>
- </id>
- <property name="name" column="NAME" type="string"></property>
- <property name="sex" column="SEX" type="string"></property>
- <property name="age" column="AGE" type="string"></property>
- <property name="birthday" column="BIRTHDAY" type="timestamp"></property>
- <joined-subclass name="com.suxiaolei.hibernate.pojos.Student" table="STUDENT">
- <key column="ID"></key>
- <property name="cardId" column="CARDID" type="string"></property>
- </joined-subclass>
- <joined-subclass name="com.suxiaolei.hibernate.pojos.Teacher" table="TEACHER">
- <key column="ID"></key>
- <property name="salary" column="SALARY" type="integer"></property>
- </joined-subclass>
- </class>
- </hibernate-mapping>
<joined-subclass>标签需要包含一个key标签,这个标签指定了子类和父类之间是通过哪个字段来关联的。
根据People.hbm.xml生成表结构:
- drop table if exists PEOPLE
- drop table if exists STUDENT
- drop table if exists TEACHER
- create table PEOPLE (
- ID varchar(255) not null,
- NAME varchar(255),
- SEX varchar(255),
- AGE varchar(255),
- BIRTHDAY datetime,
- primary key (ID)
- )
- create table STUDENT (
- ID varchar(255) not null,
- CARDID varchar(255),
- primary key (ID)
- )
- create table TEACHER (
- ID varchar(255) not null,
- SALARY integer,
- primary key (ID)
- )
- alter table STUDENT
- add index FK8FFE823BF9D436B1 (ID),
- add constraint FK8FFE823BF9D436B1
- foreign key (ID)
- references PEOPLE (ID)
- alter table TEACHER
- add index FKAA31CBE2F9D436B1 (ID),
- add constraint FKAA31CBE2F9D436B1
- foreign key (ID)
- references PEOPLE (ID)
可以看到,父类对应的表保存公有信息,子类对应的表保存独有信息,子类和父类对应的表使用一对一主键关联的方式关联起来。
在这三种方法中查询速度:第二种方案 > 第一种方案 > 第三种方案。解耦程度:第三种方案 > 第一种方案 > 第二种方案。没有那个绝对好与不好,只有最合适,我们根据需要选择一个最为恰当的即可。由于笔者更注重效率问题,所以个人比较倾向于第二种方案。
发表评论
-
教你使用Hibernate的QBC查询(转载)
2015-12-18 17:19 4219转载自:http://developer.51cto.com ... -
hibernatesynchronizer3开发工具的使用方法
2014-11-24 14:35 25881. hibernatesynchronizer3可以帮助 ... -
Hibernate锁机制(悲观锁,乐观锁)
2014-09-24 17:16 2091锁(locking) 业务逻辑的实现过程中,往往需要保证 ... -
六种方式实现hibernate查询,及IDE推荐 (转载)
2014-07-16 18:13 1252hibernate查询的6种方法。分别是HQL查询,对象 ... -
SpringMVC+Hibernate+Spring 简单的一个整合实例
2014-07-04 16:14 87772SpringMVC又一个漂亮的web框架,他与Struts2 ... -
Struts2、hibernate和spring下载,整合所需jar包
2014-07-04 16:00 4456ssh三个框架各自所有版本下载地址如下 Struts f ... -
Hibernate Criteria的 Criterion,Projection,Restrictions等条件设置
2014-04-01 16:46 38018在查询方法设计上可以灵活的根据Criteria的特点来方便 ... -
Hibernate的Example示例查询
2013-07-29 17:32 4012org.hibernate.criterion.Ex ... -
Spring与Hibernate集成中的session问题
2013-04-15 15:53 31601.通过getSession()方法 ... -
剖析Hibernate主键生成几种常用方式
2012-12-05 20:01 13201.assigned: 主键由外部程序负责生成,无需H ... -
正确理解Hibernate Inverse (转)
2012-12-05 11:02 1363通过Hibernate Inverse的设 ... -
Hibernate中session.getconnection()的替代方法
2012-08-27 16:39 51702010-04-15 10:21 Hibernate ... -
Hql总结 查询结果动态组装成List(map),List(bean),List(list),List(set)等格式(转)
2012-08-17 15:51 73241.//查询整个对象String hql="from ... -
sql和hql中join语句区别,以及hibernate中内连接,迫切内连接,左外连接,迫切左外连接,右外连接的区别(合集)
2012-07-24 17:39 3210第一:sql和hql中join语 ... -
Hibernate_HQL--实体、属性查询,参数绑定,引用查询(随时温习一遍)
2012-07-05 17:52 15925是Hibernate官方推荐的查询模式,比Criteria功能 ... -
hibernate里createSQLQuery的addEntity()和setResultTransformer()方法
2012-06-21 10:55 565481. 使用SQLQuery对原生SQL查询执行的控制是通过S ... -
hibernate的session.connection被session.dowork()替代
2012-06-14 10:22 4083Hibernate3.3.2版本中getSessi ... -
hibernateTemplate session关闭
2012-04-18 14:53 37731.虽然继承了HibernateDaoSupport这个类,但 ... -
No Hibernate Session bound to thread, and configuration does not allow creation
2012-04-18 10:57 2177用SessionFactory.getCurrentSessi ... -
Hibernate的generator属性之意义(转)
2012-04-01 11:06 1329Hibernate的Generator属性有7种class,本 ...
相关推荐
**标题:“Hibernate继承映射(Annotation)详解”** 在Java持久化框架Hibernate中,继承映射是一种关键特性,它允许开发者将对象模型的继承结构映射到数据库的表结构。在传统的面向对象编程中,继承是实现代码复用和...
**标题与描述解析** 标题“hibernate的多态查询”指的是在Hibernate框架中,如何进行涉及...通过阅读提供的文档“Hibernate映射总结.doc”,我们可以深入学习这一主题,进一步探索如何在实践中有效地运用多态查询。
### Hibernate的继承多态映射关系详解 在软件开发领域,特别是使用面向对象编程语言如Java进行开发时,我们经常需要处理复杂的类继承关系。在ORM(Object-Relational Mapping)框架如Hibernate中,如何优雅地将这些...
### Hibernate关联映射的作用与常用属性详解 #### 关联映射概述 在对象关系映射(Object Relational Mapping,简称ORM)技术中,Hibernate作为Java领域内非常成熟且功能强大的框架之一,它允许开发者将Java类映射...
### Hibernate Mapping 参数详解 在 Hibernate 中,为了将 Java 对象映射到数据库表,并实现对象关系映射(ORM),开发者需要定义一系列配置属性来指导 Hibernate 如何进行转换。本文将详细解析 `hibernate-mapping...
此外,本书还会深入到Hibernate的高级特性,如级联操作、延迟加载、集合映射、多态映射、关联映射(一对一、一对多、多对多)等。这些特性让开发者能够处理复杂的数据结构和业务逻辑。例如,级联操作允许一次操作就...
9. **多态和继承映射**:讲解如何处理类的继承关系,实现多态查询,包括单表继承、联合继承和表格派生。 10. **级联操作与代理**:阐述级联属性的使用,如何实现对象间的联动操作,以及Hibernate的动态代理机制。 ...
2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射...
4. **多态性**:Hibernate支持继承和多态,使得对具有继承关系的实体进行统一管理。 5. **事件监听器**:通过实现特定接口,可以监听和处理实体的生命周期事件,如预加载、加载、保存、更新和删除。 6. **拦截器**:...
在使用HQL时,我们能够查询具有继承、多态和关联关系的数据。 在讲解HQL基础时,我们通常会有一个预先设定的数据库环境。例如,文中提到的`joblog`数据库包含了`student`(学生表)、`course`(课程表)和`sc`(选...
- 多态关联:能够处理继承关系中的关联问题。 - SQL查询的自定义:允许开发者编写自己的SQL语句进行复杂查询。 Hibernate的核心配置文件为`hibernate.cfg.xml`,在这个文件中可以配置数据库连接信息、使用的数据库...
2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射...
2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射...
它与传统的SQL语言非常相似,但更简洁,更重要的是,HQL理解面向对象的概念,如继承、多态、关联、聚合和组合。这使得HQL在处理复杂的对象关系映射时更加灵活和强大。 ### 2. Hibernate查询能力(3.0版本) 自3.0...
**Hibernate注解详解** 在Java世界中,Hibernate作为一款强大的对象关系映射(ORM)框架,极大地简化了数据库操作。自Hibernate 3开始,引入了注解(Annotation)支持,使得开发者无需XML配置就能实现对象与数据库...
2.4.3 Hibernate映射类型接口 2.4.4 可供扩展的接口 2.5 小结 2.6 思考题 第3章 第一个Hibernate应用 3.1 创建Hibernate的配置文件 3.2 创建持久化类 3.3 创建数据库Schema 3.4 创建对象-关系映射...
2. **支持常见的面向对象编程概念**:Hibernate支持面向对象编程中常见的概念,如关联(association)、继承(inheritance)、多态(polymorphism)、组合(composition)等。 3. **高性能的对象缓存机制**:...
此外,Hibernate 还支持对象关系的复杂映射,如继承、多态和集合,使得模型更接近面向对象的设计。 **iBATIS** 则更注重 SQL 的控制权,它是一个 SQL Mapping 框架。在 iBATIS 中,SQL 语句由开发者直接编写,然后...