hibernate学习(6)——加载策略(优化)
1、 检索方式
1 立即检索:立即查询,在执行查询语句时,立即查询所有的数据。
2 延迟检索:延迟查询,在执行查询语句之后,在需要时在查询。(懒加载)
2、 检查策略
1 类级别检索:当前的类的属性获取是否需要延迟。
2 关联级别的检索:当前类 关联 另一个类是否需要延迟。
3、类级别检索
1 get:立即检索。get方法一执行,立即查询所有字段的数据。
2 load:延迟检索。默认情况,load方法执行后,如果只使用OID的值不进行查询,如果要使用其他属性值将查询 。 Customer.hbm.xml <class lazy="true | false">
lazy 默认值true,表示延迟检索,如果设置false表示立即检索,相当于get方法。

package com.alice.hibernate02.lazy; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer; public class Demo1 {
// 类级别懒加载
// load方法
// class lazy属性
// 默认值: true load获得时,会返回代理对象,不查询数据库.使用时才查询
@Test
public void test01(){
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.load(Customer.class, 6); System.out.println(cus.getName()); tran.commit();
session.close();
}
//类级别懒加载
//load方法
// class lazy属性
// lazy: false load方法执行就会发送sql语句.与get方法一致.
@Test
public void test02(){
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.load(Customer.class, 6); System.out.println(cus.getName()); tran.commit();
session.close();
}
}
4、 关联级别检索
在查询有关联关系的数据时,加载一方的数据是否需要将另一方立即查询出.
默认: 与我关联的数据,在使用时才会加载.
集合(一对多):
set
lazy: 是否对set数据使用懒加载
true:(默认值) 对集合使用才加载
false: 集合将会被立即加载
extra: 极其懒惰,如果使用集合时,之调用size方法查询数量, Hibernate会发送count语句,只查询数量.不加载集合内数据.
fetch : 决定加载集合使用的sql语句种类
select: (默认值) 普通select查询
join: 表链接语句查询集合数据
subselect: 使用子查询 一次加载多个Customer的订单数据
| fetch | lazy | 结论 |
| select | true | 默认值, 会在使用集合时加载,普通select语句 |
| select | false | 立刻使用select语句加载集合数据 |
| select | extra | 会在使用集合时加载,普通select语句,如果只是获得集合的长度,会发送Count语句查询长度 |
| join | true | 查询集合时使用表链接查询,会立刻加载集合数据 |
| join | false | 查询集合时使用表链接查询,会立刻加载集合数据 |
| jojn | extra | 查询集合时使用表链接查询,会立刻加载集合数据 |
| subselect | true | 会在使用集合时加载,子查询语句 |
| subselect | false | 会在查询用户时,立即使用子查询加载客户的订单数据 |
| subselect | extra | 会在使用集合时加载,子查询语句,如果只是获得集合的长度,会发送Count语句查询长度. |
代码测试:
package com.alice.hibernate02.lazy; import java.util.List; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order; public class Demo02 {
// 关联级别懒加载
// 默认: 与我关联的数据,在使用时才会加载.
@Test
public void test01() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 6); for (Order o : cus.getOrders()) {
System.out.println(o.getName());
} tran.commit();
session.close();
}
//关联级别懒加载
//lazy: false
@Test
public void test02() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 6); for (Order o : cus.getOrders()) {
System.out.println(o.getName());
} tran.commit();
session.close();
} //关联级别懒加载
//lazy:false
//fetch:subselect
@Test
public void test03() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 6); for (Order o : cus.getOrders()) {
System.out.println(o.getName());
} tran.commit();
session.close();
}
//关联级别懒加载
//lazy:true/false
//fetch:subselect
@Test
public void test04() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer").list(); for (Customer c: list) {
System.out.println(c.getName()+"下单数量"+c.getOrders().size());
} tran.commit();
session.close();
} //关联级别懒加载
//lazy:extra
//fetch:select
@Test
public void test05() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Customer cus = (Customer) session.get(Customer.class, 6);
//查询Customer下订单 数量
System.out.println(cus.getOrders().size()); //真正使用订单中的数据
for (Order o: cus.getOrders()) {
System.out.println(o.getName());
} tran.commit();
session.close();
}
//关联级别懒加载
//lazy:extra
//fetch:subselect
@Test
public void test06() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); @SuppressWarnings("unchecked")
List<Customer> list = session.createQuery("from Customer").list();
for(Customer c:list){
System.out.println(c.getName()+"下单数量:"+c.getOrders().size());
}
for(Customer c:list){
for(Order o :c.getOrders()){
System.out.println(c.getName()+"下单名称:"+o.getName());
}
}
tran.commit();
session.close();
} }
多对一:
<many-to-one>
lazy
false: 加载订单时,会立即加载客户
proxy:看客户对象的类加载策略来决定
no-proxy : 不做研究.
fetch
select : (默认值)使用普通select加载
join : 使用表链接加载数据
| fetch | lazy | 结果 |
| select | false | 加载订单时,立即加载客户数据.普通select语句加载客户. |
| select | proxy |
类加载策略为:lazy=false 同上 |
| join | false | 使用表链接查询订单以及对应客户信息.lazy属性无效 |
| join | proxy | 使用表链接查询订单以及对应客户信息.lazy属性无效 |
package com.alice.hibernate02.lazy; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Order; //多对一检索策略
public class Demo03 {
// 多对一检索策略
@Test
// fetch: select
// lazy: false
public void test01() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Order o = (Order) session.get(Order.class, 8);
System.out.println(o.getCustomer().getName()); tran.commit();
session.close();
} // fetch: select
// lazy: proxy
// Customer lazy:false
@Test
public void test02() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Order o = (Order) session.get(Order.class, 8);
System.out.println(o.getCustomer().getName()); tran.commit();
session.close();
} // fetch: select
// lazy: proxy
// Customer lazy:true
@Test
public void test03() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Order o = (Order) session.get(Order.class, 8);
System.out.println(o.getCustomer().getName()); tran.commit();
session.close();
} // fetch: join
// lazy: proxy|false
@Test
public void test04() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); Order o = (Order) session.get(Order.class, 8);
System.out.println(o.getCustomer().getName()); tran.commit();
session.close();
}
}
5、批量加载
set
batch-size: 决定一次加载几个对象的集合数据. in 条件加载多个用户的订单.
package com.alice.hibernate02.lazy; import java.util.List; import org.hibernate.Session;
import org.hibernate.Transaction;
import org.junit.Test; import com.alice.hibernate02.util.HibernateUtil;
import com.alice.hibernate02.vo.Customer;
import com.alice.hibernate02.vo.Order;
//批量策略
public class Demo04 { @Test
//查询所有客户
//遍历客户,打印客户下的订单信息
public void test() {
Session session = HibernateUtil.openSession();
Transaction tran = session.beginTransaction(); List<Customer> list = session.createQuery("from Customer").list(); for(Customer c:list){
System.out.println(c.getOrders().size());
} tran.commit();
session.close();
}
}

Customer Get(int id)
Return Session.load(Customer.class,id);
- layz=false
- 在Service层获得在页面要上要用到的属性=> 在Service层中确保数据已经
hibernate学习(6)——加载策略(优化)的更多相关文章
- hibernate集合的加载策略
在集合方配置lazy和fetch的方式,默认的是lazy为true,fetch为select,lazy有true,extra和false,true和extra都是懒加载,只是extra比true更懒, ...
- Hibernate 加载策略得总结
Hibernate 加载策略得总结 加载策略(优化查询): 策略种类: 延迟加载: 等到使用的时候才会加载数据. 立即加载: 不管使用不使用,都会立刻将数据加载. 策略的应用: 类级别的加载策略. 关 ...
- hibernate框架学习之数据抓取(加载)策略
Hibernate获取数据方式 lHibernate提供了多种方式获取数据 •load方法获取数据 •get方法获取数据 •Query/ Criteria对象获取数据 lHibernate获取的数据分 ...
- hibernate框架学习第六天:QBC、分页查询、投影、数据加载策略、二级缓存
QBC查询 1.简单查询 Criteria c = s.createCriteria(TeacherModel.class); 2.获取查询结果 多条:list 单挑:uniqueResult 3.分 ...
- java之hibernate之加载策略和抓取策略
1.加载策略:指hibernate查询数据时,采用什么样的方式将数据写入内存.Hibernate中提供了两种方式来加载数据:懒加载和即时加载. 2.懒加载又称延迟加载,指使用hiberante API ...
- wemall app商城源码Android之ListView异步加载网络图片(优化缓存机制)
wemall-mobile是基于WeMall的android app商城,只需要在原商城目录下上传接口文件即可完成服务端的配置,客户端可定制修改.本文分享wemall app商城源码Android之L ...
- 【死磕 Spring】----- IOC 之 Spring 统一资源加载策略
原文出自:http://cmsblogs.com 在学 Java SE 的时候我们学习了一个标准类 java.net.URL,该类在 Java SE 中的定位为统一资源定位器(Uniform Reso ...
- hibernate的懒加载
WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...
- ios资源加载策略
做了好几个月的ios,大框架都是别人搭好的,自己只是实现逻辑,很是失落.慢慢开始整理学习一些概念类的东西吧,希望自己能提高点. cocos2d-x从cocos2d-2.0-x-2.0.2开始,考虑到自 ...
- jQuery Pjax – 页面无刷新加载,优化用户体验
pjax 是 HTML5 pushState 以及 Ajax 两项技术的简称,综合这两个技术可以实现在不刷新页面的情况下载入 HTML 到当前网页,带给你超快速的浏览器体验,而且有固定链接.标题以及后 ...
随机推荐
- html新增一些常用标签
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- WPF CollectionViewSource CollectionView
CollectionView 通俗讲就是可以对你绑定的集合可以进行 分组,排序 等功能 CollectionViewSource 根据字面意思是xxx的数据源 详细的介绍还是看 http://www ...
- unlink和close关系
今天看到nginx用文件锁实现互斥的实现方案时,发现,unlink文件后还可需用fd,很是纳闷!于是搜索到此文,并自测了下,涨姿势了~分享给大家~ 原理: 每一个文件,都可以通过一个struct st ...
- MediaElement.js对不同浏览器的支持
目前已经有很多html5播放器可以使用,使用html5播放器可以轻松的在页面中插入媒体视频,从而使我们的web页面变得更加丰富多彩,所以今天向大家推荐一款非常优秀的html5播放器MediaEleme ...
- vagrant学习笔记
什么是vagrant简而言之,vagrant就是一个用来管理虚拟机文件的工具为什么要使用vagra如果经常玩虚拟机的话,就会知道,当你需要新建一个虚拟环境的时候,总是要重复的安装操作系统,以及操作系统 ...
- MIT 6.828 JOS学习笔记4. Lab 1 Part 2.1: The Boot Loader
Part 2: The Boot Loader 对于PC来说,软盘,硬盘都可以被划分为一个个大小为512字节的区域,叫做扇区.一个扇区是一次磁盘操作的最小粒度.每一次读取或者写入操作都必须是一个或多个 ...
- HDU 3642 Get The Treasury (线段树扫描线)
题意:给你一些长方体,问你覆盖三次及以上的体积有多大 首先我们观察x轴y轴一样很大,但是z轴很小,所以我们可以枚举z轴(-500,500),注意我们枚举的是每一段长度为一的z轴的xy轴的面积而不是点. ...
- DELL灵越15R5521安装黑苹果
按照网上的流程安装即可:(懒人法) 首先分出两个硬盘分区,一个10G左右(用于做系统),一个30G左右(用于装系统)://注意生成时选择不要格式化 然后利用硬盘助手将镜像文件(.cdr文件)写入10G ...
- [工作中的设计模式]迭代子模式Iterator
一.模式解析 迭代子模式又叫游标(Cursor)模式,是对象的行为模式.迭代子模式可以顺序地访问一个聚集中的元素而不必暴露聚集的内部表象 1.迭代子模式一般用于对集合框架的访问,常用的集合框架为lis ...
- Hdu5093 Battle ships 二分图
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission( ...