Hibernate学习笔记(八) — 懒载入与抓取策略
懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端的资源耗用。总结一句话:什么时候须要数据。什么时候载入。
一、懒载入
1.1 类的懒载入
由javassist产生的代理类与Classes类是继承关系。
session.load()方法产生的是代理对象,该代理类是持久化类的子类
/**
* 类的懒载入
*/
@Test
public void testClass_lazy(){
session = HibernateUtils.openSession();
transaction = session.beginTransaction();
Classes classes = (Classes) session.load(Classes.class, 1L);
//classes.setName("asdj");
System.out.println(classes.getName());//发出sql
transaction.commit();
session.close();
}
1.2 集合的懒载入
/**
* 集合的懒载入
*/
@Test
public void testCollect_lazy(){
session = HibernateUtils.openSession();
transaction = session.beginTransaction(); Classes classes = (Classes) session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();//不发出
for (Student student : students) {//迭代的时候发出sql
System.out.println(student.getName());
}
transaction.commit();
session.close();
}
/**
* 更进一步的懒载入,设置extra,对于查询行数,最大值,最小值等
*/
@Test
public void testlazy_extra(){
session = HibernateUtils.openSession();
transaction = session.beginTransaction(); Classes classes = (Classes) session.get(Classes.class, 1L);
Set<Student> students = classes.getStudents();
System.out.println(students.size());
transaction.commit();
session.close();
}
1.3 单端关联的懒载入(many2one的懒载入)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
No-proxy 延迟载入 默认值
Proxy是加强版的延迟载入
由于是通过多的一方载入一的一方。所以对效率影响不大。所以普通情况下用默认值就可以。
依据多的一端载入一的一端,其实仅仅是多查了一条数据,对性能差点儿没有影响,比方依据学生来查班级
总结
懒载入是Hibernate提供的一种优化方式。
1、延迟载入在映射文件设置,而映射文件一旦确定,不能改动了。
2、延迟载入是通过控制sql语句的发出时间来提高效率的。
所以在开发中通常是不会去设置懒载入的配置。
二、抓取策略
抓取策略解决的是怎样载入Set集合中数据的问题
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
public class FetchTest { private Session session;
private Transaction transaction;
private SessionFactory sessionFactory; /**
* fetch : select情况:
* 先查找Classes的id,在依据id查Student
* n+1条数据
* n:classes表中的条数
* 1:classes表本身
*/
@Test
public void testQueryAllStudent(){
session = HibernateUtils.openSession();
List<Classes> classes = session.createQuery("from Classes").list();
for (Classes classes2 : classes) {
System.out.println(classes2.getName());
Set<Student> students = classes2.getStudents();
for (Student student : students) {
System.out.println(student.getName());
}
}
session.close(); }
/**
* fetch : subselect情况:
* 由于该需求含有子查询,所以fetch 使用 subselect
* 2条sql
*/
@Test
public void testQueryAllStudent2(){
session = HibernateUtils.openSession();
List<Classes> classes = session.createQuery("from Classes").list();
for (Classes classes2 : classes) {
System.out.println(classes2.getName());
Set<Student> students = classes2.getStudents();
for (Student student : students) {
System.out.println(student.getName());
}
}
session.close(); }
/**
* select
* 先查询一的一方的所有的对象(Classes)。再依据每个对象的id值查询其关联对象(Student)
*/
@Test
public void testQueryClassesByCidAndStudents_Select(){
Session session = HibernateUtils.openSession();
Classes classes = (Classes)session.get(Classes.class, 1L);
System.out.println(classes.getName());
Set<Student> students = classes.getStudents();
for (Student student : students) {
System.out.println(student.getName());
}
session.close();
} /**
* join 利用左外连接一条SQL语句把classes和student表所有查询出来了
*
* 在含有子查询的需求分析中。利用join的抓取策略是不取的
* 1条sql
*/
@Test
public void testQueryClassesByCidAndStudents_Join(){
Session session = HibernateUtils.openSession();
Classes classes = (Classes)session.get(Classes.class, 1L);//发出sql,故fetch为join的抓取,会导致懒载入的失效
System.out.println(classes.getName());
Set<Student> students = classes.getStudents(); for (Student student : students) {
System.out.println(student.getName());
}
session.close();
}
}
总结:
由于抓取策略的设置在映射文件里,所以一旦映射文件生成就不能改变了。
通过发出SQL语句的不同的形式载入集合,从而优化效率的。
fetch为join的抓取策略会导致懒载入的失效
在设为join时,他会直接将从表信息以join方式查询到而不是再次使用select查询。这样导致了懒载入的失效。
抓取策略和延迟载入的结合
Set集合
1、 当fetch为join时,lazy失效
2、 当fetch为select时
假设lazy为true/extra
当遍历集合的时候,发出载入集合的sql语句
假设lazy为false
当获取班级的时候,发出载入集合的sql语句
3、 当fetch为subselect时和上面的情况一致。
Hibernate学习笔记(八) — 懒载入与抓取策略的更多相关文章
- 【Java EE 学习 48】【Hibernate学习第五天】【抓取策略】【二级缓存】【HQL】
一.抓取策略. 1.hibernate中提供了三种抓取策略. (1)连接抓取(Join Fetch):这种抓取方式是默认的抓取方式.使用这种抓取方式hibernate会在select中内连接的方式获取 ...
- Hibernate-缓存/懒加载/抓取策略
懒加载测试: /*类的延迟加载 * * session.get * 1.方法加载出来的对象是class对象 * 2.在session.get方法执行的时候发出sql语句 * 3.class对象是有值的 ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- VisionPro学习笔记:用IEEE1394相机抓取图像
1)找到采集卡: CogFrameGrabber1394DCAMs cameras = new CogFrameGrabber1394DCAMs(); 2)列举相连接的相机: ICogFrameGra ...
- Hibernate框架笔记04HQL_QBC查询详解_抓取策略优化机制
目录 1. Hibernate的查询方式 1.1 方式一:OID查询 1.2 方式二:对象导航查询 1.3 方式三:HQL方式 1.4 方式四:QBC查询 1.5 方式五:SQL查询 2. 环境搭建 ...
- Hibernate fetching strategies(抓取策略)
抓取策略(fetching strategies)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...
- Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)
假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下: 假设现在我想查询id为2的那本书的书名,使用session.get(...)方法: Session session=H ...
- Hibernate学习笔记(六)—— 查询优化
一.Hibernate的抓取策略 1.1 什么是抓取策略 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略. HIbern ...
- 【opencv学习笔记八】创建TrackBar轨迹条
createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...
随机推荐
- python中的深拷贝和浅拷贝(面试题二)
一.浅拷贝 定义:浅拷贝只是对另外一个变量的内存地址的拷贝,这两个变量指向同一个内存地址的变量值. 浅拷贝的特点: 公用一个值: 这两个变量的内存地址一样: 对其中一个变量的值改变,另外一个变量的值也 ...
- 设计模式 Singleton 单例 懒汉,线程安全
首先来明确一个问题,那就是在某些情况下,有些对象,我们只需要一个就可以了, 比如,一台计算机上可以连好几个打印机,但是这个计算机上的打印程序只能有一个, 这里就可以通过单例模式来避免两个打印作业同时输 ...
- mysql数据的操作
一.插入数据记录 1.插入完整数据记录 INSERT INTO table_name VALUES(value1,value2......valuen); 2.插入数据记录的一部分 INSERT IN ...
- Ambari是啥?主要是干啥的?
简单来说,Ambari是一个拥有集群自动化安装.中心化管理.集群监控.报警功能的一个工具(软件),使得安装集群从几天的时间缩短在几个小时内,运维人员从数十人降低到几人以内,极大的提高集群管理的效率. ...
- 编译安装php、nginx
以centos6.6为例 1.安装以及配置php 首先在官网下载源码包http://php.net/downloads.php 这里下载php-7.1.16 .tar.gzcd php-7.1.16 ...
- java_基础知识_字符串练习题_计算两个字符串的最长公共字串长度
package tek; Java算法——求出两个字符串的最长公共字符串 /** * @Title: 问题:有两个字符串str1和str2,求出两个字符串中最长公共字符串. * @author 匹夫( ...
- [Windows Server 2012] Tomcat安装方法
★ 欢迎来到[护卫神·V课堂],网站地址:http://v.huweishen.com ★ 护卫神·V课堂 是护卫神旗下专业提供服务器教学视频的网站,每周更新视频. ★ 本节我们将带领大家:Win20 ...
- ARM处理器的寄存器,ARM与Thumb状态,7中运行模式
** ARM处理器的寄存器,ARM与Thumb状态,7中运行模式 分类: 嵌入式 ARM处理器工作模式一共有 7 种 : USR 模式 正常用户模式,程序正常执行模式 FIQ模式(Fast ...
- (转) Arcgis for Javascript实现两个地图的联动
http://blog.csdn.net/gisshixisheng/article/details/40127895 今天在看天地图的时候,有一个多时相的地图显示功能,感觉很好玩,作为技术控的我晚上 ...
- ubuntu14.0开机guest账号禁用方法
在终端里进入/usr/share/lightdm/lightdm.conf.d/目录 sudo vim 50-unity-greeter.conf 然后在文件里输入: [SeatDefaults] a ...