http://wxinpeng.iteye.com/blog/624821
在Session的缓存中存放的是相互关联的对象图。默认情况下,当Hibernate从数据库中加载Customer对象时,会同时加载所有关联的Order对象。以Customer和Order类为例,假定ORDERS表的CUSTOMER_ID外键允许为null,图1列出了CUSTOMERS表和ORDERS表中的记录。
以下Session的find()方法用于到数据库中检索所有的Customer对象:
List customerLists=session.find("from Customer as c");
运行以上find()方法时,Hibernate将先查询CUSTOMERS表中所有的记录,然后根据每条记录的ID,到ORDERS表中查询有参照关系的记录,Hibernate将依次执行以下select语句:
select * from CUSTOMERS;
select * from ORDERS where CUSTOMER_ID=1;
select * from ORDERS where CUSTOMER_ID=2;
select * from ORDERS where CUSTOMER_ID=3;
select * from ORDERS where CUSTOMER_ID=4;
通过以上5条select语句,Hibernate最后加载了4个Customer对象和5个Order对象,在内存中形成了一幅关联的对象图,参见图2。
Hibernate在检索与Customer关联的Order对象时,使用了默认的立即检索策略。这种检索策略存在两大不足:
(1) select语句的数目太多,需要频繁的访问数据库,会影响检索性能。如果需要查询n个Customer对象,那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。这种检索策略没有利用SQL的连接查询功能,例如以上5条select语句完全可以通过以下1条select语句来完成:
select * from CUSTOMERS left outer join ORDERS
on CUSTOMERS.ID=ORDERS.CUSTOMER_ID
以上select语句使用了SQL的左外连接查询功能,能够在一条select语句中查询出CUSTOMERS表的所有记录,以及匹配的ORDERS表的记录。
(2)在应用逻辑只需要访问Customer对象,而不需要访问Order对象的场合,加载Order对象完全是多余的操作,这些多余的Order对象白白浪费了许多内存空间。
为了解决以上问题,Hibernate提供了其他两种检索策略:延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免多余加载应用程序不需要访问的关联对象,迫切左外连接检索策略则充分利用了SQL的外连接查询功能,能够减少select语句的数目。
分享到:
相关推荐
"2N和1+1和2N+1等几种UPS供电方式.pdf" 本文将对UPS供电方式进行详细的分析和比较,讨论2N、1+1和2N+1等几种UPS供电方式的特点、优缺点和适用场景。 在工业UPS系统中,供电方式是关键的组成部分,直接影响着系统的...
"数字乡村“1+1+N”整体规划建设方案.ppt" 该资源主要围绕“数字乡村“1+1+N”整体规划建设方案”展开,旨在探寻公共安全解决之道,借助先进技术,提升应急管理能力。该方案的核心目标是构建城市应急平台体系,打造...
我们推测一个嵌入算子,该算子将任意(2 n +1)维欧氏空间中的2 n维超曲面分配给任何2 n + 1厄米矩阵。 这对应于精确地定义与N D0个脑子相对应的模糊D(2n)脑子。 出现的超曲面上的点对应于嵌入算子的零本征态,该...
尽管1到100的项之和可以精确计算,但当n变得非常大时,计算结果会非常接近自然对数ln(n),具体公式为Hn ≈ ln(n) + γ,其中γ是欧拉-马斯cheroni常数,大约等于0.5772156649。 在C#中,可以使用`Math.Log`函数来...
6. 逻辑推理和错误证明:文档中通过假设n^5+n^4+1不是素数,然后通过推理发现这个假设会导致矛盾(n^3-n+1=1或n^2+n+1=1,但n=0或n=-1与n大于1矛盾),从而证明了原假设是错误的,即n^5+n^4+1实际上是素数。...
ls_dx[n+1]='零' case 1 ls_dx[n+1]='壹' case 2 ls_dx[n+1]='贰' case 3 ls_dx[n+1]='叁' case 4 ls_dx[n+1]='肆' case 5 ls_dx[n+1]='伍' case 6 ls_dx[n+1]='陆' case 7 ...
转盘伺复定位的程序FX2N+10PG(带注解).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例转盘伺复定位的程序FX2N+10PG(带注解).zip三菱PLC编程案例源码资料编程控制器应用通讯通信例子程序实例转盘伺复...
根据冗余备份的配置方式不同,可以分为多种类型,如1+1冗余备份、N+1冗余备份以及本文重点讨论的**N+K**形式冗余备份等。 #### 二、Petri网及其在通信系统分析中的应用 **Petri网**是一种用于描述并行系统行为的...
【数字乡村“1+1+N”整体规划建设方案】 在当今信息化快速发展的时代,数字乡村建设已成为推动乡村振兴的重要抓手。"1+1+N"的整体规划方案是数字乡村建设的一种模式,旨在通过综合运用信息技术手段,全面提升乡村的...
标题中的“直流电机 +298n+pwm+换向”揭示了本次讨论的主要内容,涉及四个关键概念:直流电机、298n扭矩、PWM(脉宽调制)以及换向技术。以下是对这些知识点的详细解释: 1. 直流电机: 直流电机是一种将电能转换...
**例1:** 给定数列 \(\{a_n\}\),其中 \(a_1=1, a_2=2, a_3=-1\),并且满足 \(a_{n+2}a_{n+1} = 4a_{n+2} - 6a_{n+1} + 9a_n - 6\)。求通项公式 \(a_n\)。 **分析:** 这是一个非线性齐次递归数列,无法直接应用特征...
当递推公式形如\( a_{n+1} = p + a_n \)或\( a_{n+1} = pa_n \)时,我们可以利用累加法(逐差相加法)或累乘法(逐商相乘法)求解通项公式。例如,若已知\( a_2 = 2a_1 + 1 \),可以通过逐差相加求解数列的通项。 ...
文章分析了R n +1的旋转超曲面及其相关的几何量,利用共形参数找出了R n +1的任意阶极小 旋转超曲面并给出参数表达式,同时分析了几种特殊的情形。
1. **多语言支持**:Notepad++支持超过50种编程语言的语法高亮,如C、C++、Java、Python、PHP等。 2. **编码转换**:它可以处理各种字符编码,包括ASCII、UTF-8、UCS-2等,方便处理不同编码的文本文件。 3. **多文档...
a_n y_{t+n} + a_{n-1} y_{t+n-1} + \cdots + a_1 y_{t+1} + a_0 y_t = b_t \] 其中\( a_n, a_{n-1}, \ldots, a_1, a_0 \)为常数,且\( a_n \neq 0 \),\( b_t \)是关于时间\( t \)的函数。相应的**齐次方程**为 \[ ...
1. **多文档界面(MDI)**:用户可以同时打开并编辑多个文件,方便进行多任务处理。 2. **查找和替换功能**:强大的搜索和替换功能,支持正则表达式,让代码修改变得简单快捷。 3. **宏功能**:录制和播放宏,能自动...
1739-基于单片机的电梯控制系统(八楼控制+LCD1602+L298N+点击+按键+原理图、源代码、proteus仿真、动画) 资料介绍: 基于单片机的电梯控制系统 一共有八个楼层; 在液晶显示器中显示电路上下行;楼层;可显示当前...
这个函数通过检查n是否为1或0来处理基本情况,然后对更大的n值进行递归调用,直到达到基本情况为止。 接下来,我们需要一个主程序来获取用户输入的整数n,并计算1!到n!的和。可以使用`Console.ReadLine()`来读取...
它可以控制两个电机的正反转和速度,并且能够承受较高的电源电压和电流,因此在各种电机驱动项目中非常常见。 MG513P30是一款直流电机,它的具体参数可能会根据不同的产品型号有所差异,但通常包括额定电压、电流、...
`MAKETFORM('projective', A)`用一个非奇异的(N+1)-by-(N+1)矩阵A构建N维的投影变换结构,其中A(N+1, N+1)不能为0。A定义了一个前向变换,TFORMFWD(U, T)将1-by-N向量U映射为1-by-N向量X,满足X = W(1:N)/W(N+1),...