【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 ...
随机推荐
- thinkphp中field的用法
ThinkPHP的连贯操作方法中field方法有很多的使用技巧,field方法主要目的是标识要返回或者操作的字段,下面详细道来. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model ...
- Windows phone 8 学习笔记(7) 设备
原文:Windows phone 8 学习笔记(7) 设备 本节主要涉及到 Windows phone 8 手机支持的各类设备,包括相机.设备状态,振动装置等.还有各类感应器,包括磁力计.加速度器和陀 ...
- memcached 分布式聚类算法
memcached 分布式集群,该决定必须书面开发商自己.和redis 由分布式server决定.上 memcached 有两个选项用于分布式.第一个是:模运算 另一种是:一致性hash 分布式算法. ...
- hdu 4107当卡段树
其核心思想是记录最大的节点值和最低值,假设max<p要么min>=p时间,在节点只变化add值,不要子树遍历:否则,就往子树递归. #include<iostream> #in ...
- 【夸QT十一】外来物品:通用脚本帮助Web运行基础Linux命令
需求分析: 需要注意的是在这里第一次,这个人是不是QT系列文章,它是关于Web的,之所以写这篇文章.这是因为碍着Web相关开发时间,而且往往涉及linux与底层指令处理.例如,创建一个文件夹,删除一个 ...
- MQTT学习笔记——Yeelink MQTT维修 采用mqtt.js和paho-mqtt
0 前言 2014年8月yeelink推出基于MQTT协议的开关类型设备控制API.相比于基于HTTP RESTful的轮训方式,通过订阅相关主题消息,能够远程控制类应用实时性更好. 本文使用 ...
- play framework2.5.
play framework2 的学习笔记 https://github.com/playframework/playframework https://github.com/playframewor ...
- simple factory, factory method, abstract factory
simple factory good:1 devide implementation and initialization2 use config file can make system more ...
- [Windows Phone] 在 Windows Phone 8 控制闪光灯
原文:[Windows Phone] 在 Windows Phone 8 控制闪光灯 ? 前言 在 Windows Phone 如果想要控制闪光灯,该怎麽做?在 Windows Phone 8 提供类 ...
- 为什么Redis比Memcached易
GitHub版本号地址: https://github.com/cncounter/translation/blob/master/tiemao_2014/Redis_beats_Memcached/ ...