什么事延迟加载?

     当真正需要数据时才执行SQL语句,其本意是减少不必要的性能开销!

之前提到过一个延迟加载的例子:

  load();结果集不能为空

  当真正去打印对象属性时,sql语句才执行!

  

hibernate的lazy属性:

  lazy属性

    类级别:true(默认)/false

    一对多关联级别:true(默认)/extra(加强延迟加载)/false

    多对一关联级别:proxy(默认)/no-proxy(无代理加载)/false

  下面用代码来区别他们:

  类级别: 

    这里使用load()属性,get()属性在操作类级别时不具备延迟加载特性 

 /**
* 测试延迟加载
*/
public void get(){
session=factory.openSession();
session.beginTransaction();
//类加载
Student stu=(Student)session.load(Student.class,2);
//测试
System.out.println("--输出了--");
//输出姓名
System.out.println(stu.getName());
session.close();
} /**
*--输出了--
*Hibernate:
* select
* student0_.stuno as stuno1_0_,
* student0_.name as name1_0_,
* student0_.gradeid as gradeid1_0_
* from
* student student0_
* where
* student0_.stuno=?
*小芳
*
**/

  可以看到延迟加载了!

  现在我修改class lazy属性为false;

/**
*<class name="Student" table="student" dynamic-update="true" *lazy="false">
**/
/**get()方法里面代码不变**/
/**
*Hibernate:
* select
* student0_.stuno as stuno1_0_,
* student0_.name as name1_0_,
* student0_.gradeid as gradeid1_0_
* from
* student student0_
* where
* student0_.stuno=?
*--输出了--
*小芳
*
**/

一对多关联级别:

  现在我们将类级别去掉,一对多关联获取一遍,使用session.get()方法测试

   

 /**
* 一对多延迟加载
*/
public void getByone2more(){
session=factory.openSession();
session.beginTransaction();
//类加载
Grade grade=(Grade)session.load(Grade.class,2);
Set<Student> stu=grade.getStu(); //测试
System.out.println("--输出了--");
//输出集合大小
System.out.println(stu.size());
//输出姓名
for(Student st:stu){
System.out.println(st.getName()); }
session.close(); }

默认配置下:

  跟前面的一样,先查询年级。打印”输出了“;

  先执行了get()发起的select语句!

更改lazy 属性为 extra:

输出结果:

  

  注释掉打印学生那句:

  会发现查询总记录时,select count(stuno),我们在将extra改为true,这时候查询语句select stuno,name......

  总结:

    有的时候我们只需要知道集合中元素的个数,或者集合是否为空,并不需要知道都有哪些数据时,可以使用extra提高效率。

可见加强延迟加载采用了特定的语句查询必要的语句

--多对一

  默认的lazy属性值为proxy;

  设置为proxy时,延迟加载,同上,当查询 id时,不会执行sql去查询!

Hibernate关联映射之延迟加载的更多相关文章

  1. 第六章 Hibernate关联映射

    第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...

  2. 【学习笔记】Hibernate关联映射(Y2-1-6)

    Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...

  3. 第三章Hibernate关联映射

    第三章Hibernate关联映射 一.关联关系 类与类之间最普通的关系就是关联关系,而且关联是有方向的. 以部门和员工为列,一个部门下有多个员工,而一个员工只能属于一个部门,从员工到部门就是多对一关联 ...

  4. Hibernate关联映射关系

    Hibernate关联映射关系 一.双向一对多关联映射关系:当类与类之间建立了关联,就可以方便的从一个对象导航到另一个或另一组与它关联的对象(一对多双向关联和多对一双向关联是完全一样的) 1.1创建实 ...

  5. Oracle primary,unique,foreign 区别,Hibernate 关联映射

    Oracle primary,unique,foreign 区别 转:http://www.cnblogs.com/henw/archive/2012/08/15/2639510.html NOT N ...

  6. (转)Hibernate关联映射——对象的三种关系

    http://blog.csdn.net/yerenyuan_pku/article/details/70148618 Hibernate关联映射——对象的三种关系 Hibernate框架基于ORM设 ...

  7. (转)Hibernate关联映射——一对多(多对一)

    http://blog.csdn.net/yerenyuan_pku/article/details/70152173 Hibernate关联映射——一对多(多对一) 我们以客户(Customer)与 ...

  8. Hibernate关联映射(一对多/多对多)

    版权声明:翀版 https://blog.csdn.net/biggerchong/article/details/843401053.  Hibernate关联映射上接Hibernate持久化类:h ...

  9. Java三大框架之——Hibernate关联映射与级联操作

    什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...

随机推荐

  1. schtasks在win7下提示错误:无法加载列资源

    转自: http://blog.chinaunix.net/uid-24946452-id-2887851.html 查看cmd 编码 chcp 如使用 936中文GBK编码的话 schtasks.e ...

  2. Java学习-039-源码 jar 包的二次开发扩展实例(源码修改)

    最近在使用已有的一些 jar 包时,发现有些 jar 包中的一些方法无法满足自己的一些需求,例如返回固定的格式,字符串处理等等,因而需要对原有 jar 文件中对应的 class 文件进行二次开发扩展, ...

  3. MySql超新手入门

    https://www.kancloud.cn/thinkphp/mysql-tutorial/36457

  4. mysql 查表失败

    我们数据库迁移,我进数据库的目录都需要拷贝什么到新的数据库才可以用,我直接拷贝的库报错了[]北京- 2016/1/26 16:07:33 mysql> use payment;Database  ...

  5. Python之路-python(Queue队列、进程、Gevent协程、Select\Poll\Epoll异步IO与事件驱动)

    一.进程: 1.语法 2.进程间通讯 3.进程池 二.Gevent协程 三.Select\Poll\Epoll异步IO与事件驱动 一.进程: 1.语法 简单的启动线程语法 def run(name): ...

  6. iis 重新注册 .net 方法

    dhl:IIS注册ASP.NET 1.1.2.0.4.0_在win7下如果先安装vs2010 后安装iis7的话,必须注册iis才可以用.~~~!!鄙视微软   IIS中ASP.NET的版本号此时可选 ...

  7. 产生0-9 A-Z a-z

    >题目要求: >>产生26个大写字母 >>产生26个小写字母 >>产生0-9这10个阿拉伯数字 >程序实现: package cn.fury.test; ...

  8. JavaAPI_01

    >JavaAPI 文档注释可以在:类,常量,方法上声明 文档注释可以被javadoc命令所解析并且根据内容生成手册 package cn.fury.se_day01; /** * 文档注释可以在 ...

  9. (地址)propedit安装说明的地址

    proedit http://propedit.sourceforge.jp/eclipse/updates/

  10. LUA OOP 单例模式实现的 一个 方案

    单例 存在这么一类class, 无论class怎么初始化, 产生的instance都是同一个对象. Code string.toHTMLCode = function(self) return enc ...