
本着应用的目的快速学习Hibernate4框架
- Hibernate检索策略
前面的话
本节主要介绍:
本节主要讲解Hibernate4的检索策略,主要包括如下:
- Lazy
- batch-size
- Fetch
检索策略属性Lazy
Lazy:true (默认)延迟检索; one-to-many 一对多
Lazy:false 延迟检索; one-to-many 一对多
Lazy:extra 增强延迟检索; one-to-many 一对多
Lazy:proxy (默认)延迟检索; many-to-one 多对一
- Lazy:no-proxy 无代理延迟检索; many-to-one 多对一
用一个Demo测试Lazy属性,Demo包括Student类和Class类,类图如下:

Student.hbm.xml
1 | <?xml version="1.0"?> |
Class.hbm.xml
1 | <?xml version="1.0"?> |
数据库中表之间的关系如下:

一、lazy=”true”
这是默认的方式,也可以在Class.hbm.xml显式配置如下:
1 | <set name="students" inverse="true" lazy="true"> |
JUnit测试:
1 |
|
二、lazy=”false”
在Class.hbm.xml配置如下:
1 | <set name="students" inverse="true" lazy="false"> |
JUnit测试:
1 |
|
三、lazy=”extra”
当lazy=”true”时,执行如下语句:
1 |
|
生成的SQL如下:
Hibernate: select class0_.classId as classId1_0_0_, class0_.className as classNam2_0_0_ from t_class class0_ where class0_.classId=?
Hibernate: select students0_.classId as classId3_0_0_, students0_.studentId as studentI1_1_0_, students0_.studentId as studentI1_1_1_, students0_.studentName as studentN2_1_1_, students0_.classId as classId3_1_1_ from t_student students0_ where students0_.classId=?
当只需要查询students数量的时候,并没有对SQL进行优化,降低了效率和系统的性能。
此时配置lazy=”extra”时,执行以上语句的生成的SQL如下:
Hibernate: select count(studentId) from t_student where classId =?
Tips:虽然优化归优化了,但是在实际开发中使用的比较少,因为实际开发基本上不可能只获取数量,一般是要获取数据的。
四、lazy=”proxy”
在Student.hbm.xml配置如下:
1 | <many-to-one name="c" column="classId" class="cn.codeforgod.model.Class" |
JUnit测试:
1 |
|
代理类student中的c对象虽然不为空,但是也没有数据。
Tips:在实际开发中常用的属性有
lazy="true"和lazy="false",其它用的非常少。
五、lazy=”no-proxy”
此属性需要编译时字节码增强。
当执行完Student student = (Student) session.get(Student.class, Long.valueOf(1));时,student对象中的c为null,当执行student.getC().getName();时再去数据库中查询获取数据。
检索策略属性batch-size
- 批量延迟检索
- 批量立即检索
一、批量延迟检索
配置如下:
<set name="students" inverse="true" lazy="true" batch-size="3">
<!-- 被参考的外键 -->
<key column="classId"></key>
<one-to-many class="cn.codeforgod.model.Student"/>
</set>
二、批量立即检索
配置如下:
<set name="students" inverse="true" lazy="false" batch-size="3">
<!-- 被参考的外键 -->
<key column="classId"></key>
<one-to-many class="cn.codeforgod.model.Student"/>
</set>
检索策略属性Fetch
Fetch:select(默认) 查询方式
Fetch:subselect 子查询方式
Fetch:join 迫切做外连接查询方式
一、Fetch:select(默认)
因为是默认的,所以不做说明了。
二、Fetch:subselect
配置如下:
<set name="students" inverse="true" lazy="false" batch-size="3"
fetch="subselect">
<!-- 被参考的外键 -->
<key column="classId"></key>
<one-to-many class="cn.codeforgod.model.Student" />
</set>
三、Fetch:join
配置如下:
<set name="students" inverse="true" lazy="false" batch-size="3"
fetch="join">
<!-- 被参考的外键 -->
<key column="classId"></key>
<one-to-many class="cn.codeforgod.model.Student" />
</set>
join一般用在get()方法中,所有的配置要视情况而定,调优性能。