Hibernate关联映射之延迟加载
什么事延迟加载?
当真正需要数据时才执行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关联映射之延迟加载的更多相关文章
- 第六章 Hibernate关联映射
第六章 hibernate关联映射一.本章知识点分为2部分:1.关联关系:单向多对一关联关系,双向一对多关联关系(含一对多关联关系),多对多关联关系2.延迟加载:类级别加载策略,一对多加载策略,多对一 ...
- 【学习笔记】Hibernate关联映射(Y2-1-6)
Hibernate关联映射 关联映射就是将关联关系映射到数据库里,在对象模型中就是一个或多个引用. 1.单向多对一关联 准备数据库 部门表和员工表 其中部门表有两列 部门编号和名称 员工表有三列 员工 ...
- 第三章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关联映射——对象的三种关系
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 ...
- Java三大框架之——Hibernate关联映射与级联操作
什么是Hibernate中的关联映射? 简单来说Hibernate是ORM映射的持久层框架,全称是(Object Relational Mapping),即对象关系映射. 它将数据库中的表映射成对应的 ...
随机推荐
- P1079 Vigenère 密码
#include <bits/stdc++.h> using namespace std; const int maxn = 1005; int main() { freopen(&quo ...
- 获取外部配置JDBC文件 写给自己
web项目要把配置放在WEB下 内容 Driver=com.microsoft.sqlserver.jdbc.SQLServerDriverurl=jdbc:sqlserver://192.168.3 ...
- dubbo 试用全过程
概述: dubbo服务容器是一个standalone的启动程序,因为后台服务不需要Tomcat或JBoss等Web容器的功能,如果硬要用Web容器去加载服务提供方,增加复杂性,也浪费资源. 服务容器只 ...
- LightOj 1289 - LCM from 1 to n(LCM + 素数)
题目链接:http://lightoj.com/volume_showproblem.php?problem=1289 题意:求LCM(1, 2, 3, ... , n)%(1<<32), ...
- Java接口与实例化
看代码看到 public Runnable r = new Runnable() { @Override public void run() { ... } } 接口不能new ,不过可以生成一个匿名 ...
- 7.7 使用rollup子句
--向rollup传递一列select division_id,sum(salary) from employees2 group by rollup(division_id); --向rollup传 ...
- 管理不同版本ruby和rails的利器——rvm
近年来,ruby on rails逐渐火了起来,我想各位码农早就耳闻,特别是那些做B/S项目的童鞋,早就想跃跃一试了. 笔者也是初次接触ruby on rails ,我想,对于初学者来说,最好的学习方 ...
- 写在开始编写Java之前(1)——Java的跨平台性
Java语言之所以比C语言更加实用 是有原因的 Java的一个重要的特点——跨平台性 无论是哪个平台,如Windows.Linus还是Mac系统 Java的语法都是一样的 这个要比C语言用处要广 因为 ...
- RabbitMq 应用
RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.它可以用于大型软件系统各个模块之间的高效通信,支持高并发,支持可扩展. 前提是你的RabbitMq服务已搭建好,制作一个winfor ...
- css巧妙实现分隔线
单个标签实现分隔线 .demo_line_01{ padding: 0 20px 0; margin: 20px 0; line-height: 1px; border-left: 200px sol ...