【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 ...
随机推荐
- Html A标签中 href 和 onclick用法、区别、优先级别
原文:Html A标签中 href 和 onclick用法.区别.优先级别 如果不设置 href属性在IE6下面会不响应hover.双击后会选中标签的父容器而非这个一a标签(IE下都存在这一问题). ...
- Xcode6在10.9.4上面crash解决
具体请看我的evernote 这里: 在10.9.4系统上面直接安装xcode6的beta3.和平时一样, 1.将beta3拖拽到application文件夹中. 2.等待copy完毕,执行xcode ...
- Tomcat6 Session建立机制简要
底: 测试部门做压力测试, 结果没多久新闻,出现OutOfMemory. 查找原因,通过监视工具,查找StandardSession(org.apache.catalina.session.Stan ...
- python学习之list
list: 创建:list = [5,7,9] 取值和改值:list[1] = list[1] * 5 列表尾插入:list.append(4) 去掉第0个值并返回第0个值的数值:list.pop(0 ...
- hdu2242(树形dp+tarjan+缩点)
hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...
- WPF 数字小键盘Themes
<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" x ...
- uva live 4394 String painter 间隔dp
// uva live 4394 String painter // // 问题是,在培训指导dp运动主题,乍一看,我以为只是一点点复杂 // A A磕磕磕,两个半小时后,.发现超过例子.然而,鉴于他 ...
- Android定位功能
不说废话,直接说说实现android定位有关的API吧. 这些API都在android.location包下,一共有三个接口和八个类.它们配合使用即可实现定位功能. 三个接口: GpsStatus.L ...
- AES加密 C++调用Crypto++加密库 样例
这阵子写了一些数据加密的小程序,对照了好几种算法后,选择了AES,高级加密标准(英语:Advanced Encryption Standard,缩写:AES).听这名字就非常厉害的样子 预计会搜索到这 ...
- [cocos2dx笔记008]cocos2d 用luabridge手动绑定类
基于cocos2dx 2.2.2版本号.这几天使用了cocostudio实现了,动画.骨骼动画.UI编辑.粒子效果,尽管有些不足,但已经算是很好了.今天尝试用lua.这个很easy.创建的时候.设置语 ...