前面几种关系我们曾经就常常常使用,对于继承我们也并不陌生,常常接触的类与类之间的继承用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(三)的更多相关文章

  1. Hibernate学习笔记三:对象关系映射(一对一,一对多,多对一,多对多)

    如需转载,请说明出处:http://www.cnblogs.com/gudu1/p/6895610.html Hibernate通过关系映射来表示数据库中表与表之间的关系,关系映射可以通过两种方式:配 ...

  2. Hibernate学习(三)———— 一对多映射关系

    序言 前面两节讲了hibernate的两个配置文件和hello world!.还有hibernate的一级缓存和三种状态,基本上hibernate就懂一点了,从这章起开始一个很重要的知识点,hiber ...

  3. Hibernate 学习(三)

    一.关系映射 实体类之间的关联映射以及表之间的关系是 ORM 的灵魂之处.对象间的关系的子集可以用下列四种方式解释.关联映射可以是单向的也可以是双向的.  映射类型 描述 Many-to-One 使用 ...

  4. Hibernate学习笔记三 多表

    一对多|多对一 表中的表达 实体中的表达 实体代码: package com.yyb.domain; import java.util.HashSet; import java.util.Set; p ...

  5. Hibernate学习(三)

    Hibernate的查询方法(五种) 一.OID查询:按主键查询 --get( ) --load( ) 二.对象导航查询:通过已经查询到的联系人,得到起关联的对象 三.SQL查询 四.HQL查询(** ...

  6. Hibernate学习笔记三

    1.1.1 Hibernate的关联关系映射:(多对多) 1.1.1.1 多对多的配置: 步骤一创建实体和映射: Student: public class Student { private Int ...

  7. 【Java EE 学习 46】【Hibernate学习第三天】【多对多关系映射】

    一.多对多关系概述 以学生和课程之间的关系为例. 1.在多对多关系中涉及到的表有三张,两张实体表,一张专门用于维护关系的表. 2.多对多关系中两个实体类中应当分别添加对方的Set集合的属性,并提供se ...

  8. Hibernate学习第三天(2)(多对多关系映射)

    1.1.1      Hibernate多对多关系的配置 1.1.1.1   创建表 l   用户表 CREATE TABLE `sys_user` ( `user_id` bigint(32) NO ...

  9. Hibernate学习(三)一对多数据的保存

    保存习惯代码 @Test public void saveTwoTableTest(){ Transaction transaction = null; try { transaction = ses ...

  10. Hibernate学习笔记三:常用数据库操作语句

    转载请注明原文地址: 一:HQL 1:HQL语句格式:select from POJO类名 where 条件表达式 group by 属性 having 聚集函数 order by 属性 [其中,fr ...

随机推荐

  1. 再探vim经常使用命令

     最開始学习过vim,见 http://blog.csdn.net/u011848617/article/details/12837873 之后以前不了了之,当再次学习后,发现经常使用命令的掌握还 ...

  2. 图画(txt等一下)实施开放的默认下载的默认浏览器,而不是(Java文本)

    在网络上,假设我们超链接地址对应于jpg档,txt档,点击链接,默认浏览器打开这些文件,而不是下载,那么,你如何实现竞争力的默认下载. 1.可通过自己写一个download.jsp来实现 <%@ ...

  3. ecshop 后台批量上传商品 完整上传

    ecshop 后台批量上传商品,之所以无法上传,是因为后台上传php文件方法中没有导入商品原图路径 将ecshop根目录中的admin/goods_batch.php文件全部修改为 <?php ...

  4. win7问题解决,凭据管理器和无法访问,不允许一个用户使用一个以上用户名与服务器或共享资源进行多重连接。

    WIN7凭据管理器,如果你用一个帐号远程登录以后在电脑中会记住这个信息,假如你想用另外的帐号,那么就到控制面板-凭据管理器里中进行修改或者删除. 如果你登录以后提示,“无法访问.不允许一个用户使用一个 ...

  5. VMware GSX Server 3.2.1 Build 19281免费下载

    VMware GSX Server 3.2.1 Build 19281免费下载 评论2   字号:大中小 订阅 VMware官方下载: For Windows 版系统:http://download3 ...

  6. 为应用程序池“XX”提供服务的进程在与 Windows Process Activation Service 通信时出现严重错误

    场景 WCF应用程序部署在IIS7中,使用net.tcp协议对外给几百台客户端提供服务,应用程序池不断崩溃重启. 分析过程 在事件查看器中看到的错误信息类似于 为应用程序池“XX”提供服务的进程在与 ...

  7. Web Worker在WebKit中的实现机制

    web worker 是执行在后台的 JavaScript,独立于其它脚本.不会影响页面的性能.这是HTML5的一个标准:实现上讲.浏览器为wokrer启动了新的线程,从而实现了异步操作的功能; 以下 ...

  8. JQuery日记_5.13 Sizzle选择器(六)选择器的效率

        当选择表达式不符合高速匹配(id,tag,class)和原生QSA不可用或返回错误时,将调用select(selector, context, results, seed)方法,此方法迭代DO ...

  9. ArrayList实现借壳

    随着Collections工具: import java.util.ArrayList; import java.util.Collections; public class TTEST { publ ...

  10. Android Handler Message总结一下

    当应用程序启动时,会开启一个主线程(也就是UI线程).由她来管理UI.监听用户点击.来响应用户并分发事件等.所以一般在主线程中不要运行比較耗时的操作,如联网下载数据等,否则出现ANR错误.所以就将这些 ...