【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 ...
随机推荐
- 公司需求知识自学-Oracle的Package的作用及用法
Oracle的Package的作用 简化应用设计.提高应用性能.实现信息隐藏.子程序重载. 1.Oracle的Package除 了把存储过程放到一堆儿以外还有没有其他的作用(好处)? 你不觉得把存储过 ...
- php判断页面是电脑登录还是手机登录
首先说最根本的解决方法: 手机访问时,会附带发送user-agent信息,这个信息里面会有手机号码信息,那么如果能取得手机号码,则可以肯定是通过手机wap访问的.但是目前 中国移动已经屏蔽了user- ...
- PHP 字符串正则替换函数preg_replace使用说明
1. preg_replace() $msg = preg_replace("/<style>.+<\/style>/is", "", ...
- 辛星一起了解下后续PHP性能功能
关于第一个发言,这篇文章是我的原创.但,这些数据不被总结出来我,你可以搜索下"百度project师HDK",这些数据提供了他,我只是给一个总结.因为他很长的文章,我在这里提炼几点. ...
- HTML5 RPG游戏引擎 地图实现篇
一,话说全国年夜事 前没有暂看到lufy的专客上,有一名伴侣念要一个RPG游戏引擎,出于兴趣筹办入手做一做.因为我研讨lufylegend有冶时间了,对它有必然的依赖性,因而便筹办将那个引擎基于 ...
- 新浪微博。。openapi 分享 图画+ 写作
新浪微博困难啊 .. . .. .郁闷死了. .在此记录它 1.使用界面:https://api.weibo.com/2/statuses/upload_url_text.json 能够申请,.高级权 ...
- FPGA开机状态
最近调试FPGA电路时发现一个问题,我从来没有注意过.我们都知道Xilinx的FPGA有三种功率M引脚,这是为了让我们配置三个引脚FPGA装载机模式,什么是主要的字符串.从字符串.并行等.,该手册有. ...
- Cocos2d-x 3.1.1 学习日志14--CocosStudio学习必看
听说Cocos Studio非常久了,主要是由于骨骼动画.眼下看来Cocos2d-x播放动画的方式仅仅有2种: 第一种:是播放序列帧动画,即将动画的每一帧都载入进缓存里,须要播放时再使用Animati ...
- 微软中国裁员曝光:在CD结束后!薪酬不变!
聚众抗议的前诺基亚员工(腾讯科技配图) 腾讯科技 郭晓峰 腾讯科技刚刚获取了一份微软设备事业部中国区管理团队4日晚间发给被裁员工的补偿方案邮件. 邮件内容显示,微软承诺在收购诺基亚交易结束(2014年 ...
- 乐在其中设计模式(C#) - 观察者模式(Observer Pattern)
原文:乐在其中设计模式(C#) - 观察者模式(Observer Pattern) [索引页][源码下载] 乐在其中设计模式(C#) - 观察者模式(Observer Pattern) 作者:weba ...