hibernate检索策略(抓取策略)
检索策略
类级别检索
默认检索策略:默认延迟加载, 可以使用lazy属性来进行改变.
session.get(clazz,object)默认立即加载
@Test //测试左外连接查询
public void test13(){
Session session = HibernateUtils.getSession();
Transaction bt = session.beginTransaction();
Customer customer = session.get(Customer.class,1);
bt.commit();
session.close();
}
session.load(clazz,object)默认延迟加载 可以使用Hibernate.initialize(customer)初始化数据;
@Test //load延迟加载
public void test14(){
Session session = HibernateUtils.getSession();
Transaction bt = session.beginTransaction();
Customer customer = session.load(Customer.class,1);
bt.commit();
session.close();
}
关联级别检索
一对一<one-to-one>
一对多/多对一 <set>下有<one-to-many> <many-to-one>
多对多<many-to-many>
我们主要是在set下one-to-many或many-to-one设置lazy和fetch
查询一个客户下的订单
set上
| lazy |
|
||||||
| fetch |
|
未进行设置则默认为懒加载
@Test
public void test15(){
Session session = HibernateUtils.getSession();
Transaction bt = session.beginTransaction();
String hql="from Customer c right outer join c.orders";
Query query = session.createQuery(hql);
List<Object[]> list = query.list();
bt.commit();
session.close();
}
sql打印:
Hibernate:
select
customer0_.c_id as c_id1_0_,
customer0_.name as name2_0_
from
test.c_customer customer0_
打印结果证明只进行查询了customer对象
其中Order对象未进行加载 这样就是在调用时会发送sql语句进行查询 为了解决这一事件 我们让Customer立即加载
修改其配置文件:
<set lazy="false" > //设置立即加载
再次执行会sql打印
Hibernate:
select
customer0_.c_id as c_id1_0_,
customer0_.name as name2_0_
from
test.c_customer customer0_
Hibernate:
select
orders0_.o_customer_id as o_custom4_1_0_,
orders0_.o_id as o_id1_1_0_,
orders0_.o_id as o_id1_1_1_,
orders0_.o_money as o_money2_1_1_,
orders0_.o_receiverInfo as o_receiv3_1_1_,
orders0_.o_customer_id as o_custom4_1_1_
from
test.o_order orders0_
where
orders0_.o_customer_id=?
Hibernate:
select
orders0_.o_customer_id as o_custom4_1_0_,
orders0_.o_id as o_id1_1_0_,
orders0_.o_id as o_id1_1_1_,
orders0_.o_money as o_money2_1_1_,
orders0_.o_receiverInfo as o_receiv3_1_1_,
orders0_.o_customer_id as o_custom4_1_1_
from
test.o_order orders0_
where
orders0_.o_customer_id=?
这样在查询customer时会进行查询order
测试lazy=extra属性
<set lazy="true" > //设置延迟加载
执行以下方法
@Test
public void test15(){
Session session = HibernateUtils.getSession();
Transaction bt = session.beginTransaction();
String hql="from Customer";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
/*int size = list.size();
System.out.println(size);*/
for (Customer customer : list) {
System.out.println(customer.getOrders().size());
}
//操作
bt.commit();
session.close();
}
sql打印:
Hibernate:
select
customer0_.c_id as c_id1_0_,
customer0_.name as name2_0_
from
test.c_customer customer0_
Hibernate:
select
orders0_.o_customer_id as o_custom4_1_0_,
orders0_.o_id as o_id1_1_0_,
orders0_.o_id as o_id1_1_1_,
orders0_.o_money as o_money2_1_1_,
orders0_.o_receiverInfo as o_receiv3_1_1_,
orders0_.o_customer_id as o_custom4_1_1_
from
test.o_order orders0_
where
orders0_.o_customer_id=?
1
Hibernate:
select
orders0_.o_customer_id as o_custom4_1_0_,
orders0_.o_id as o_id1_1_0_,
orders0_.o_id as o_id1_1_1_,
orders0_.o_money as o_money2_1_1_,
orders0_.o_receiverInfo as o_receiv3_1_1_,
orders0_.o_customer_id as o_custom4_1_1_
from
test.o_order orders0_
where
orders0_.o_customer_id=?
100
<set lazy="extra" > //设置加强延迟加载
sql打印为:
Hibernate:
select
customer0_.c_id as c_id1_0_,
customer0_.name as name2_0_
from
test.c_customer customer0_
Hibernate:
select
count(o_id)
from
test.o_order
where
o_customer_id =?
1
Hibernate:
select
count(o_id)
from
test.o_order
where
o_customer_id =?
100
总结:
对于懒加载和加强懒加载区别:都是是在调用时才会产生,但是区别在于发送sql语句的意义;
懒加载在发送sql语句时会发送查询全部的语句,返回为每一列,而加强懒加载发送的是count(*),我需要什么加强懒加载会给我什么直接查询,而懒加载不会.
测试fetch 只是sql的生成方式不同而已
<set name="orders" lazy="false" fetch="subselect" > //subselect生成子查询
@Test
public void test15(){
Session session = HibernateUtils.getSession();
Transaction bt = session.beginTransaction();
String hql="from Customer";
Query query = session.createQuery(hql);
List<Customer> list = query.list();
bt.commit();
session.close();
}
sql打印:
Hibernate:
select
customer0_.c_id as c_id1_0_,
customer0_.name as name2_0_
from
test.c_customer customer0_
Hibernate:
select
orders0_.o_customer_id as o_custom4_1_1_,
orders0_.o_id as o_id1_1_1_,
orders0_.o_id as o_id1_1_0_,
orders0_.o_money as o_money2_1_0_,
orders0_.o_receiverInfo as o_receiv3_1_0_,
orders0_.o_customer_id as o_custom4_1_0_
from
test.o_order orders0_
where
orders0_.o_customer_id in ( //子查询
select
customer0_.c_id
from
test.c_customer customer0_
)
在<many-to-one>或<one-to-one>如果去查询对方
| fetch |
|
||||||
| lazy |
|
hibernate检索策略(抓取策略)的更多相关文章
- Hibernate(十四)抓取策略
抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...
- hibernate 延迟加载和抓取策略
一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...
- Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取
1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...
- 【转】hibernate延迟加载和抓取策略
一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...
- 【Hibernate学习】 —— 抓取策略(注解方式)
当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...
- Hibernate查询方式&抓取策略
Hibernate的查询方式 1.OID查询 hibernate根据对象的OID(主键)进行检索 使用get方法 Customer customer=session.get(Customer.clas ...
- 【Hibernate 8】Hibernate的调优方法:抓取策略
在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
- Hibernate的抓取策略(优化)
延迟加载的概述 什么是延迟加载 延迟加载:lazy(懒加载).执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询. 延迟加载的分类 l 类级别的延 ...
随机推荐
- css布局之头尾固定中间高度自适应
被这个问题困扰了很久.大神别鄙视我,我是搞后台开发的....试过了很多方法,比如设定高度100%.同事用的js计算高度,我对js设置的方式一直觉得不够好,尽管设置高度为100%的方式更差,直到发现了一 ...
- vue2.0后台系统
参考网址: http://www.cnblogs.com/linxin/p/6509897.html
- vue2.0跨域携带cookie和IE兼容
/*vue-resource为了跨域获取到cookie做的操作*/ 1vue-resource跨域问题Vue.http.interceptors.push(function(request, next ...
- 8K - 圆桌会议
HDU ACM集训队的队员在暑假集训时经常要讨论自己在做题中遇到的问题.每当面临自己解决不了的问题时,他们就会围坐在一张圆形的桌子旁进行交流,经过大家的讨论后一般没有解决不了的问题,这也只有HDU A ...
- (轉)EasyUI - DataGrid 去右边空白滚动条列
熟悉 EasyUI - DataGrid 的童鞋应该会注意到这样一个情景: 想去掉这块,找了下资料,发现也有人同样纠结:http://www.cnblogs.com/hantianwei/p/3440 ...
- Hadoop(二) HADOOP集群搭建(简化版)
1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconfig/network ...
- iOS.PrototypeTools
1. iPhone/iPad 原型工具 http://giveabrief.com/ 2. proto.io https://proto.io/ 3. Origami http://facebook. ...
- Selenium+PhantomJS
Selenium Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,类型像我们玩游戏用的按键精灵,可以按指定的命令自动操作,不同是Selenium 可以直接运行在浏览器上, ...
- sqli-labs:7,导入导出;8-10 延时注入
1,Load_file()导出文件 使用条件: A.必须有权限读取并且文件必须完全可读(and (select count(*) from mysql.user)>0/* 如果结果返回正常,说明 ...
- 企业官网Web原型制作分享-Tesla
Tesla是汽车行业知名的奢华品牌,产品为纯电动汽车,知名度极高.此模板正是取自Tesla的官网,高端大图配上文字排版,彰显了汽车的奢华感觉. 本原型由国产Mockplus(原型工具)和iDoc(智能 ...