【Hibernate学习】 ——ORM(三)
前面几种关系我们曾经就常常常使用,对于继承我们也并不陌生,常常接触的类与类之间的继承用extendskeyword,那么在表与表的关系中怎样表示呢?以下我们来讲继承映射。
继承有三种实现的策略,单表继承,详细表继承,类表继承。以下来分析一下这三种方式
继承关联类关系
单表继承
每棵类继承树使用一个表,可知,这三个类在一张表中。例如以下表:
这张表包含了父类,子类的全部属性,通过Type来区分是哪个子类。
对象模型映射到关系模型:
<classname="com.bjpowernode.hibernat.Animal" table="t_animal">
<idname="id">
<generatorclass="native"/>
</id>
<!--鉴别字段,父类中定义,指定区分的字段名称和类型-->
<discriminatorcolumn="type" type="string"/>
<propertyname="name"/>
<propertyname="sex"/>
<!--鉴别值-->
<subclassname="Pig" discriminator-value="P">
<propertyname="weight"/>
</subclass>
<subclassname="Bird" discriminator-value="B">
<propertyname="height"/>
</subclass>
</class>
每棵类继承树一张表,类继承树相应多个类,要把多个类的信息放到一张表中,必须有某种机制来区分哪些记录是属于哪个类的。也就是上面discriminator字段,用这个字段的值来区分。
优缺点:表中引入了用来区分子类的字段;假设某个子类的属性不能为空,那么在数据库中不能设置该字段非空,灵活性差;维护方便,仅仅须要改动一张表;假设子类添加,那么表中的冗余字段也会随着增多。假设数据不是非常多的话,效率是最好的。
详细表继承
每一个子类一个表,与父类所相应的表以一对一主键关联的方式关联起来,例如以下
animal表中存储了子类的全部记录,仅仅记录公共信息。它们独有的信息存储在子类表中。通过父表与子表的id来进行关联。
对象模型映射到关系模型
<classname="com.bjpowernode.hibernat.Animal" table="t_animal">
<idname="id">
<generatorclass="native"/>
</id> <propertyname="name"/>
<propertyname="sex"/> <joined-subclassname="Pig" table="t_pig">
<keycolumn="pid"/>
<propertyname="weight"/>
</joined-subclass> <joined-subclassname="Bird" table="t_bird">
<keycolumn="bird"/>
<propertyname="height"/>
</joined-subclass>
</class>
该类继承映射用<joined-subclass>标签,用于指示父类与子类的关联字段。
优缺点:这样的方式符合关系模型的设计原则,不存在冗余,维护起来较方便,对每一个类的改动仅仅须要改动其相应的表,灵活性好;全然參照对象继承的方式进行配置。另外层次清晰,可是假设类继承的层次特别多,表特别多时,效率会非常低,所以假设层次少的能够用此方式。
类表继承
每一个详细类一个表,依据上面的类图看,共同拥有两张表,pig,bird各一张
每一个子类相应的数据库表不仅包含自身的属性还包含父类的属性。
对象模型映射到关系模型
<classname="com.bjpowernode.hibernat.Animal" table="t_animal">
<idname="id">
<generatorclass="native"/>
</id> <propertyname="name"/>
<propertyname="sex"/> <union-subclassname="Pig" table="t_pig">
<keycolumn="pid"/>
<propertyname="weight"/>
</union-subclass> <union-subclassname="Bird" table="t_bird">
<keycolumn="bird"/>
<propertyname="height"/>
</union-subclass>
</class>
该类型的继承映射用<union-subclass>标签,用于指示出该hbm文件所表示的类的子类
优缺点:该方式符合关系模型的设计原则,可是表中存在反复字段,假设对公共属性部分进行改动则须要改动全部子类所相应表中的属性值,映射的灵活性非常大。另外对于子类的查询仅仅须要訪问单独的表,对于父类的查询须要检索全部的表。
小结
通过上面三种方式优缺点的总结,再总结一下:
从复杂度的角度,方式1简单(子类属性不多);方式2主外键;方式3有反复字段;
从查询性能,方式1效率高;方式2须要表内连接或左外连接;方式3若查询父类须要查询全部类表;
从可维护性,方式1仅仅须要改动一张表;方式2若某个属性发生变化改动此类相应的表;方式3若父类属性变化须要改动全部子类相应的表。
也就是说,当子类属性不多时,优先选择方式1,;子类属性多,要求不严格时,优先选择方式2。
看完后后,继承映射是不是没有那么深奥了。三种方式听起来非常厉害,事实上还是环绕着我们之前所学过的主外键,第三张表,各种连接等。这些都是基础。
【Hibernate学习】 ——ORM(三)的更多相关文章
- Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)
如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...
- Hibernate学习(三)———— 一对多映射关系
序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...
- Hibernate 学习(三)
一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的. 映射类型 描述 Many-to-One 使用 ...
- Hibernate学习笔记三 多表
一对多|多对一 表中的表达 实体中的表达 实体代码: package com.yyb.domain; import java.util.HashSet; import java.util.Set; p ...
- Hibernate学习(三)
Hibernate的查询方法(五种) 一.OID查询:按主键查询 --get( ) --load( ) 二.对象导航查询:通过已经查询到的联系人,得到起关联的对象 三.SQL查询 四.HQL查询(** ...
- Hibernate学习笔记三
1.1.1 Hibernate的关联关系映射:(多对多) 1.1.1.1 多对多的配置: 步骤一创建实体和映射: Student: public class Student { private Int ...
- 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】
一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...
- Hibernate学习第三天(2)(多对多关系映射)
1.1.1 Hibernate多对多关系的配置 1.1.1.1 创建表 l 用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...
- Hibernate学习(三)一对多数据的保存
保存习惯代码 @Test public void saveTwoTableTest(){ Transaction transaction = null; try { transaction = ses ...
- Hibernate学习笔记三:常用数据库操作语句
转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...
随机推荐
- 抢车位中的排名bug(比較使用了无符号数)
昨天把这个发在了qzone,想来还是怪怪的,还是转过来不吧,纯当发现了一个虫子,玩笑一下.只是csdn如今不能贴图,挺郁闷的,原文在http://user.qzone.qq.com/110907073 ...
- Android 性能优化 五 性能分析工具dumpsys的使用
Android提供的dumpsys工具能够用于查看感兴趣的系统服务信息与状态,手机连接电脑后能够直接命令行运行adb shell dumpsys 查看全部支持的Service可是这样输出的太多,能够通 ...
- php如何判断用户是从指定页面跳转进来的
$_SERVER['HTTP_REFERER']下'HTTP_REFERER' 引导用户代理到当前页的前一页的地址(如果存在).由 user agent 设置决定.并不是所有的用户代理都会设置该项,有 ...
- POJ 3181 Dollar Dayz 简单DP
这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...
- registerWithTouchDispatcher()函数的使用
registerWithTouchDispatcher()函数的使用 registerWithTouchDispatcher()函数主要用于注册Touch事件. 当我们使用this->setTo ...
- Ubuntu在下面LAMP(Linux+Apache+MySQL+PHP) 开发环境的搭建
LAMP在行业是一个非常流行的词.此4字母代表Linux.Apache,MySQL和PHP. LAMP其高效.灵活的特点已经成为中小企业的首选. 它已经推出了快速构建LAMP道路. 1 在Ubuntu ...
- 《HBase权威指南》读书笔记----简介
工作中要使用HBase,刚刚开始接触HBase,理解不深,只是记录一下 . HBase基于google的bigtable论文实现,属于nosql. 几个概念: (1)列(column):最基本单位为列 ...
- POJ---2243 Knight Moves 使用A*算法的广度优先搜索
题目链接:http://poj.org/problem?id=2243 启发式搜索:启发式搜索就是在状态空间中的搜索对每一个搜索的位置进行评估,得到最好的位置,再从这个位置进行搜索直到目标.这样可以省 ...
- 第4周 页面限制8060 bytes
原文:第4周 页面限制8060 bytes 恭喜您!在你面前就只剩下几页了,然后你就可以完成第1个月的SQL Server性能调优培训了.今天我将讲下页的一些限制,还有为什么你会喜欢这些限制,同时也会 ...
- Eclipse中为什么创建DynamicWebProject后没有默认的web.xml文件?
在Eclipse中新建DynamicWebProject的时候不要直接点"完毕",在下一步有个勾选项(Generate web.xml deployment descriptor) ...