第六章 Hibernate关联映射
第六章 hibernate关联映射
一、本章知识点分为2部分:
1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系
2.延迟加载:类级别加载策略,一对多加载策略,多对一加载策略
二、关联关系
1.单向多对一关联关系
1.1.概念(什么是单向多对一关联关系,举例说明)
以部门(Dept)、Emp(员工)为例: 从员工角度看部门,是多个员工都在一个部门,这就叫单向
如部门编号为20的部门下可以有n个员工(如scott账户下emp表 empno 为7369,7566,7788等),即这n个员工在emp表的deptno字段上都是20.
当我们查询 员工7369这条数据时,可以获得这个员工信息对应的Emp对象。
Emp e = (Emp)session.get(Emp.class,7356);//根据主键id获取员工信息
//打印员工编号、部门编号,
System.out.println("员工:"+e.getEmpNo()+" 所在部门为:"e.getDeptno());
//如果需要获取部门名称等信息还需根据deptno去查dept表
session.createQuery("from Dept where deptno = 20");
//hibernate 中对于这种单向多对一提供了便捷操作,将EMP表对应的Emp实体类中deptno属性由外键字段更改为Dept实体类就可以获得相应部门实体对象。如下
实体类Emp 中 原 private Byte deptno; 改为 private Dept dept;
实体类做了更改那么对应的Emp 映射文件也就要随之改变。如下
原映射文件中
<property name="deptno" type="java.lang.Byte" column="DEPTNO"></property> 改为
<manny-to-one name="dept" class="com.bdqn.entity.Dept" column="DEPTNO"></many-to-one>
这样就达到了单向多对一关联关系配置,我们再去更改一下刚才测试代码。
Emp e = (Emp e)session.get(Emp.class,7356);//根据主键id获取员工信息
Dept d = e.getDept();//获取员工对应的部门
System.out.println("员工:"+e.getEmpNo()+" 所在部门为:"d.getDeptName());//
总结:单向多对一实质是能够在"多"这个实体上获取"一"的信息。具体语法重点如下:
(1) 在"多"这个实体上去配置"一",即将"一"这个外键属性更改为实体对象。
(2) "多"对应的映射文件上的外键属性节点由普通的<property />节点替换成<many-to-one/>节点。其中class 属性配置为"一"的实体类型以替换原来property节点的type属性,其他属性(name,column)配置和property 节点一样。
1.3 单向多对一增删改。
参照示例5,6,7.
每操作一步去看下myeclipse 中控制台答应的sql.
如果控制台没有sql 输出,则是hibernate没有配置允许sql打印信息。则需在hibernate.cfg.xml 中增加以下节点
<property name="show_sql">true</property><!-- 是否控制台打印sql ,true为打印,false 为不打印 -->
<property name="format_sql">true</property><!-- 打印sql是否格式化 -->
2 双向一对多关联
2.1 概念
以部门(Dept)、Emp(员工)为例: 从部门角度看看,一个部门有多个员工,这就叫单向一对多。而从双向上来看就是一个是单向一对多,一个是单向多对一,我们统称为一对多双向关联或者多对一双向关联。
2.2 配置与语法(单向一对多)
如部门编号为20的部门下可以有n个员工(如scott账户下emp表 empno 为7369,7566,7788等),即这n个员工在emp表的deptno字段上都 是20.
当我们查询 部门号为20这条数据时,可以获得这个部门信息对应的Dept对象。
Dept d = (Dept)session.get(Dept.class,20);//根据主键id获取部门信息
System.out.println("部门编号:"+d.getDeptNo()+" 所在部门为:"e.getDeptName());
//如果需要获取部门内员工等信息还需根据deptno去查Emp表
List<Emp> empList = session.createQuery("from Emp where deptno = 20");
//hibernate 中对于这种单向一对多提供了便捷操作,在Dept实体类中增加结婚<Set> emps 属性。如下
实体类Dept 中增加 private Set<Emp> emps = new HashSet<Emp>();//这个集合代表这个部门下所有员工的信息
实体类做了更改那么对应的Dept 映射文件也就要随之改变。如下
原映射文件中增加<Set> 节点
<set name="emps"><!-- 与与实体类属性emps保持一致,即 Set<Emp> emps ,代表这个部门下所有员工的集合 -->
<one-to-many class="cn.bdqn.entity.Emp" />
<key column="DEPTNO" ></key>
</set>
<!--以上代码 意义是
1.emps 代表某一部门下所有员工记录(即实体类Emp)。
2.emps 是hibernate 通过 查询class属性配置的-->Emp实体类-->找到对应EMP,然后通过 配置的key节点下的column属性
-->找到该部门下所有员工的。这个过程相当于Hibernate自己可以完成,我们只需要配置后直接调用就行了。
这样就达到了单向多对一关联关系配置,我们再去更改一下刚才测试代码。
Dept d = (Dept)session.get(Dept.class,20);//根据主键id获取部门信息
Set<Emp> emps = d.getEmps();
for(Emp e :emps){
System.out.println("部门编号:"+d.getDeptNo()+" 员工编号为:"e.getEmpNo());
}
总结:单向多对一实质是能够在"一"这个实体上获取"朵"的信息。具体语法重点如下:
(1) 在"一"这个实体上去配置"多",即增加"一"实体对象集合。
(2) "一"对应的映射文件上的增加<set>节点。
<set name="emps"><!-- 与与实体类属性emps保持一致,即 Set<Emp> emps ,代表这个部门下所有员工的集合 -->
<one-to-many class="cn.bdqn.entity.Emp" />
<key column="DEPTNO" ></key>
</set>
2.3 双向关联下的增删改(主要是单向一对多 中 set 的设置)
1.cascade
参照示例9,10,11.
每操作一步去看下myeclipse 中控制台答应的sql.
2.inverse
参照示例12以及后续代码.
每操作一步去看下myeclipse 中控制台答应的sql.
3.order-by
参照示例13.
每操作一步去看下myeclipse 中控制台答应的sql.
3.双向关联
和多对一类似,可自己总结。
4延迟加载
分为:类级别加载策略,一对多加载策略,多对一加载策略
4.1类延迟加载策略<class lazy="true/false">默认为true
关联函数:
代理对象:session.load(*.class,id);当lazy为true时,返回代理对象,即只有OID的实体类对象
session.get(*.class,id);无论lazy为true或false,返回的都是全数据对象
Query;HIbernate.initialize();
4.2一对多加载策略<set lazy="true/false/extra" />
当lazy为true时,dept下emps为空集合,当lazy为false时,dept下emps为代理对象集合
关联函数:get(*.class,id);当lazy为true时,set<Emp> 集合为空
set常用方法size();iterator();contain();isEmpty();
在lazy为true时,可初始化set数据
lazy为extra时,size();iterator();contain();isEmpty()这些方法初始化无效
4.3多对一加载策略<many-to-one lazy="proxy/no-proxy/false">
false:全数据;
proxy:带OID的对象;
no-proxy:无;
5 OpenSessionInView
......
第六章 Hibernate关联映射的更多相关文章
- 第三章Hibernate关联映射
第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...
- Hibernate关联映射关系
Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...
- Oracle primary,unique,foreign 区别,Hibernate 关联映射
Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- (转)Hibernate关联映射——对象的三种关系
http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...
- (转)Hibernate关联映射——一对多(多对一)
http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...
- Hibernate关联映射(一对多/多对多)
版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053. Hibernate关联映射上接Hibernate持久化类:h ...
- Hibernate关联映射(单项多对一和一对多、双向一对多)
最近总是接触着新的知识点来扩展自己的知识面:不停的让自己在原地接触天空的感觉真的很美好!!!革命没有成功,程序员的我们怎么能不努力呢...... 一.用员工和部门来剖析关联映射的原理. 1)从这张截图 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
随机推荐
- PHP+Jquery+Ajax 实现动态生成GUID、加载GUID
GUID: 全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符.GUID主要用于在拥有多个节点.多台计算机的网络或系统中 ...
- linux中添加环境变量(python为例)
最近想用Django搭建个人博客,之前学了些python基础语法,准备边学习Django边实战操作.自己有一个阿里云服务器,用的centOS,自带的是python2.7版本,我直接安装了python3 ...
- JavaScript设计模式之构造器、模块和原型
JavaScript面向对象 JavaScript是一种无类语言,但可以使用函数来模拟,这就涉及到设计模式.模式是一种已经验证过的可复用的解决方案,可用于解决软件设计中遇到的常见的问题,通常将这些解决 ...
- hudson入门
持续集成hudson入门博客分类: Java 单元测试配置管理maven项目管理Tomcat 极限编程中一项建议实践便是持续集成,持续集成是指在开发阶段,对项目进行持续性自动化编译.测 ...
- ThinkPhp知识大全(非常详细)
php框架 一.真实项目开发步骤: 多人同时开发项目,协作开发项目.分工合理.效率有提高(代码风格不一样.分工不好) 测试阶段 上线运行 对项目进行维护.修改.升级(单个人维护项目,十分困难,代码风格 ...
- js小动画算法
function step(A,B,rate,callback){ A = A + (B - A) / (rate || 2); if(Math.abs(A-B) < 1){ callback( ...
- Java面试15|网络
1.TCP(Transmission Control Protocol)三次握手与四次分手 TCP在不可靠的传输信道上提供了可靠传输的抽象,隐藏了我们的应用程序大部分的复杂性功能:丢包重传,按序传送, ...
- Apache无法启动原因
Apache不能启动解决办法 作者的话:遇到这个问题的时候,从网上找了很多资料,结果都是让我这个新手摸不着头绪 还好,在我长时间的查找下,还是找到了一篇文章,解决了我的烦恼,下面是我对这个文章的一些对 ...
- STL部分的实现
C++的STL很强大,里面实现很多功能 就平时经常会用到的vector之类的,自己实现一下, 有哪块错误的希望大神给予指点 vector类模板 template<typename T>cl ...
- Android开发遇到手机无法弹出Toast
今天遇到了一个很奇怪的问题,一个很简单的程序,就是点击按钮弹出一个Toast,但在手机上运行起来,却没有正常弹出Toast 第一反应就是看看是否调用了show方法,很显然,并不是这个低级问题,为了确定 ...