Hibernate fetching strategies(抓取策略)
抓取策略(fetching strategies)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询(CriteriaQuery)中重载声明。
在这里我们还是创建categroy与book的关联关系。
在Hibernate中定义了如下几种抓取策略:
①.连接抓取(Join fatching)- Hibernate通过在select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合。
在关系关联的配置中中有一个属性fetch,默认为select,这里我们将它设置为join,然后我们去查询数据发现,这里的延迟加载并没有起作用,而是在查询book时直接使用外连接将categroy一起查询出来。



②.查询抓取(select fetching)- 另外发送一条select语句抓取当前对象的关联实体或集合。除非你显示的指定lazy=false禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
在关系关联的配置中中有一个属性fetch,默认为select,它在这里做了什么操作呢?我们在查询book的信息时,我们想要获取categroy的信息时发出一条select语句去查询categroy的信息。至于在什么时候去查询categroy的信息在于前面设置的lazy的值,如果设置为false则在查询book的信息时会一并查询categroy的值,如果不为false时则是在使用categroy时再去查询。

③.子查询抓取(Sunbselect fetching)- 另外发送一条select语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显示的指定lazy=false禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。
在这我们去查询所有的categroy,并且查询categroy下的所有书籍。这里有使用的上衣篇所学过的iterate迭代n+1。在查询过程中我们发现,Hibernate首先将所有的categroy查询出来,然后再去查询每一个categroy下的book,这样的话就感觉查询book有点重复,有点多余。于是我们在这里就要使用子查询抓取(Subselect fetching),而且 Subselect fetching受到lazy的影响,如果将lazy设置为false,则在查询categroy时就会将含有categroy信息的book全部查询出来,如果将lazy设置为非false,则会再使用book信息时再去查询。


将fetch修改为subselect后查询发现只出现2条sql语句,其中一条是查询categroy的信息,而剩下一条则是查询的book信息,其中使用了in语句,将所有包含categroy的book都查询了出来。


并且这里还可以使用in将categroy进行过滤,而且在下面查询book时也会直接将这些categroy的book查询出来。


电脑屏幕小,不能直接截图,只能将sql直接复制下来。
select
books0_.category_id as category2_1_1_,
books0_.book_id as book_id1_0_1_,
books0_.book_id as book_id1_0_0_,
books0_.category_id as category2_0_0_,
books0_.author as author3_0_0_,
books0_.book_name as book_nam4_0_0_,
books0_.price as price5_0_0_,
books0_.pub_date as pub_date6_0_0_
from
Book books0_
where
books0_.category_id in (
select
this_.id
from
Category this_
where
this_.id in (
?, ?, ?
)
)
④.批量抓取(Batch fetching)- 对查询抓取的优化方案,通过指定一个主键或者外键列表,Hibernate使用单条select语句获取一批对象实例或集合。
在进行大数据量操作时会速度缓慢,所以这里使用了Batch fetching来进行操作。我们在这里将set中batch-size设置为2,意思是将2条sql合在一起查询,因为这里有延迟加载,在使用到book时才会查询,而且是使用一次查询一次,但是在这里将batch-size设置为2,就会在使用到book时一次查询出2个book的信息,查到第3条book信息时再去查询。这样在一定程度上加快了查询效率。


注:本文是在学习期间根据网上视频写的学习笔记,如有侵权请联系删除!
Hibernate fetching strategies(抓取策略)的更多相关文章
- hibernate 延迟加载和抓取策略
一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...
- 【转】hibernate延迟加载和抓取策略
一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...
- Hibernate(十四)抓取策略
抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...
- Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取
1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...
- 【Hibernate学习】 —— 抓取策略(注解方式)
当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...
- Hibernate查询方式&抓取策略
Hibernate的查询方式 1.OID查询 hibernate根据对象的OID(主键)进行检索 使用get方法 Customer customer=session.get(Customer.clas ...
- hibernate抓取策略
抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...
- 【转】Hibernate 原汁原味的四种抓取策略
最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...
- Hibernate 原汁原味的四种抓取策略(转)
原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html 尊重原作者,访问原创地址 最近在研究 Hibernate ...
- Hibernate中的多表查询及抓取策略
1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...
随机推荐
- 【BZOJ】2154: Crash的数字表格 莫比乌斯反演
[题意]给定n,m,求Σlcm(i,j),1<=i<=n,1<=j<=m,n,m<=10^7. [算法]数论(莫比乌斯反演) [题解] $$ans=\sum_{i\leq ...
- SDUT 3928
Description C~K 和 PBH 经常玩一个游戏.游戏规则如下:现给定一个 n*n 的棋盘,一个石头被放在棋盘的左上角. 他们轮流移动石头.每一回合,两个人只能把石头向上,下,左,右四个方向 ...
- NEO发行资产Token
NEO注册发行全局资产(Token 和 Share)功能已经在neo-gui里面集成,发行非常方便, 高级-注册资产 注册Token消耗GAS感人 4990 Gas 点击调用,获取交易ID为资产ID ...
- 【Python学习】字符编码
先说两个基础知识. (1)计算机内部,数据是由0,1组成的: (2)计算机最小的数据单位,就是一个二进制单位即bit,接下来就是8个二进制单位表示一个字节(Byte). 1 ASCII码 ASCII码 ...
- SVM问题再理解与分析——我的角度
SVM问题再理解与分析--我的角度 欢迎关注我的博客:http://www.cnblogs.com/xujianqing/ 支持向量机问题 问题先按照几何间隔最大化的原则引出他的问题为 上面的约束条件 ...
- 21.Merge Two Sorted Lists---《剑指offer》面试17
题目链接:https://leetcode.com/problems/merge-two-sorted-lists/description/ 题目大意: 给出两个升序链表,将它们归并成一个链表,若有重 ...
- Oracle中的dual
简介,摘自百度百科: Oracle提供的最小的表,不论进行何种操作(不要删除记录),它都只有一条记录——'X'. 例如:执行select * from dual,里面只有一条记录:执行insert i ...
- 关于angular导入第三方库的问题
angular-cli使用webpack来将模块打包,在这里配置的scripts和styles会被打包成script.bundle.js和styles.bundle.js文件加载到前台页面. 这样就可 ...
- u-boot中的Makefile
在windos下,pc机上电之后,BIOS会初始化硬件配置,为内核传递参数,引导操作系统启动,并且识别C盘.D盘.等整个操作系统启动起来之后,才可以运行应用程序比如QQ.QQ音影.同理,在嵌入式Lin ...
- ZOJ 1610 Count the Colors(区间染色)
题目大意:多组数据,每组给一个n(1=<n<=8000),下面有n行,每行有l,r,color(1=<color<=8000),表示将l~r颜色变为color,最后求各种颜色( ...