hibernate抓取策略fetch详解

转载 2012年03月29日 14:28:00

hibernate抓取策略fetch详解
一、hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join)
测试用例:
Student student = (Student)session.get(Student.class, 1);
System.out.println(student.getName());
System.out.println(student.getClasses().getName());

1)保持默认,同fetch="select",如:
<many-to-one name="classes" column="classesid" fetch="select"/>

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

hibernate抓取策略fetch详解
执行结果:2条语句

Hibernate: select student0_.id as id1_0_, student0_.name as name1_0_, student0_.class_id as class3_1_0_ from student_join student0_ where student0_.id=?
学生1
Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from classes_join classes0_ where classes0_.id=?
高一(1)班
2)设置fetch="join",如:
<many-to-one name="classes" column="classesid" fetch="join"/>

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

hibernate抓取策略fetch详解
此时lazy会失效

执行结果:一条join语句

Hibernate: select student0_.id as id1_1_, student0_.name as name1_1_, student0_.class_id as class3_1_1_, classes1_.id as id0_0_, classes1_.name as name0_0_ from student_join student0_ left outer join classes_join classes1_ on student0_.class_id=classes1_.id where student0_.id=?
学生1
高一(1)班
二、hibernate抓取策略(集合代理的批量抓取,fetch=select(默认)/join/subselect)

测试用例:

Classes c = (Classes) session.load(Classes.class, new Integer(1));
System.out.println("Class.name=" + c.getName());
Set stuSet = c.getStudents();
System.out.println(stuSet.size());
if(stuSet != null && !stuSet.isEmpty()){
for(Iterator it = stuSet.iterator(); it.hasNext();){
Student s = (Student) it.next();
System.out.println("student.name=" + s.getName());
}
}

1)hibernate抓取策略fetch详解
保持默认,同fetch="select",如:
<set name="students" inverse="true" fetch="select">

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

测试结果:2条独立的查询语句

Hibernate: select classes0_.id as id0_0_, classes0_.name as name0_0_ from classes_join classes0_ where classes0_.id=?
Class.name=高一(1)班
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
9
student.name=学生7
student.name=学生3
student.name=学生1
student.name=学生8
student.name=学生2
student.name=学生4
student.name=学生5
student.name=学生9
student.name=学生6

(2)设置fetch="join",如:
<set name="students" inverse="true" fetch="join">

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

此时lazy会失效

测试结果:1条独立的join查询语句

Hibernate: select classes0_.id as id0_1_, classes0_.name as name0_1_, students1_.class_id as class3_3_, students1_.id as id3_, students1_.id as id1_0_, students1_.name as name1_0_, students1_.class_id as class3_1_0_ from classes_join classes0_ left outer join student_join students1_ on classes0_.id=students1_.class_id where classes0_.id=?
Class.name=高一(1)班
9
student.name=学生6
student.name=学生4
student.name=学生9
student.name=学生7
student.name=学生2
student.name=学生3
student.name=学生8
student.name=学生1
student.name=学生5
(3)设置fetch="subselect",如:用在查询语句中
<set name="students" inverse="true" fetch="subselect">

fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

测试用例:

List classList = session.createQuery("from Classes where id in (1,2,3)").list();
for(Iterator iter = classList.iterator(); iter.hasNext();){
Classes c = (Classes)iter.next();
System.out.println("Class.name=" + c.getName());
Set stuSet = c.getStudents();
System.out.println(stuSet.size());
if(stuSet != null && !stuSet.isEmpty()){
for(Iterator it = stuSet.iterator(); it.hasNext();){
Student s = (Student) it.next();
System.out.println("student.name=" + s.getName());
}
}
}

当不设fetch="subselect" ,即:<set name="students" inverse="true">,结果如下:

执行了3条查询语句

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from classes_join classes0_ where classes0_.id in (1 , 2 , 3)
Class.name=高一(1)班
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
9
student.name=学生8
student.name=学生5
student.name=学生3
student.name=学生9
student.name=学生7
student.name=学生1
student.name=学生4
student.name=学生6
student.name=学生2
Class.name=高一(2)班
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
4
student.name=学生3
student.name=学生4
student.name=学生1
student.name=学生2
Class.name=高一(3)班
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id=?
0


当不设fetch="subselect" ,即:<set name="students" inverse="true" fetch="subselect">,结果如下:

执行了1条查询语句(嵌套子查询)

Hibernate: select classes0_.id as id0_, classes0_.name as name0_ from classes_join classes0_ where classes0_.id in (1 , 2 , 3)
Class.name=高一(1)班
Hibernate: select students0_.class_id as class3_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student_join students0_ where students0_.class_id in (select classes0_.id from classes_join classes0_ where classes0_.id in (1 , 2 , 3))

 

 

------------------------------------------------------

总结:

hibernate抓取策略(单端代理的批量抓取)

保持默认,同fetch="select",如:
<many-to-one name="classes" column="classesid" fetch="select"/>

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

 

2.hibernate抓取策略(单端代理的批量抓取)

设置fetch="join",如:
<many-to-one name="classes" column="classesid" fetch="join"/>

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

此时lazy会失效

 

3.hibernate抓取策略(集合代理的批量抓取)

保持默认,同fetch="select",如:
<set name="students" inverse="true" cascade="all" fetch="select">

fetch="select",另外发送一条select语句抓取当前对象关联实体或集合

 

4.hibernate抓取策略(集合代理的批量抓取)

设置fetch="join",如:
<set name="students" inverse="true" cascade="all" fetch="join">

fetch="join",hibernate会通过select语句使用外连接来加载其关联实体或集合

此时lazy会失效


5.hibernate抓取策略(集合代理的批量抓取)

设置fetch="subselect",如:
<set name="students" inverse="true" cascade="all" fetch="subselect">

fetch="subselect",另外发送一条select语句抓取在前面查询到的所有实体对象的关联集合

 

6.hibernate抓取策略,,batch-szie在<class>上的应用

batch-size属性,可以批量加载实体类,参见:Classes.hbm.xml
<class name="Classes" table="t_classes" batch-size="3">

当查classes对象时发出9条hql语句配置过后batch-size=3后会之发9/3=3条hql语句,提高性能

 

7.hibernate抓取策略,batch-szie在集合上的应用


batch-size属性,可以批量加载实体类,参见:Classes.hbm.xml
<set name="students" inverse="true" cascade="all" batch-size="5">

当查students对象时发出10条hql语句配置过后batch-size=5后会之发10/5=2条hql语句,提高性能

 

 

总体上分析:默认是fetch="select"       当配置fetch="join"时直接查询包含的对象或者集合lazy失效。


相关文章推荐

hibernate抓取策略fetch详解

hibernate抓取策略fetch详解 一、hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join) 测试用例: Student student = (Stu...

hibernate抓取策略fetch

抓取策略(fetching strategy)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间经行导航的时候,hibernate如何获取关联对象的策略。 1、select抓取:当...

Hibernate抓取策略以及如何避免cannot simultaneously fetch multiple bags异常

转自:http://dyldragon.iteye.com/blog/788385 在说解决cannot simultaneously fetch multiple bags异常之前,我...

Hibernate--fetch抓取策略

有几个需要注意的地方: 1 在xml配置中 是默认懒加载的(fetch=select),也就是在使用到懒加载对象的属性时候  才会发出SQL语句,不使用的话就发一个SQL即可,若遍历时使用关联对象的...

hibernate抓取策略fetch=select /join/subselect

一、hibernate抓取策略(单端代理的批量抓取fetch=select(默认)/join) 测试用例: Student student = (Student)session.get(Stude...

hibernate抓取策略 batch-size | hibernate.jdbc.fetch_size 和 hibernate....

batch-size属性,可以批量加载实体类, hbm.xml classes.hbm.xml "http://hibernate.sourceforge.net/hiber...

18. Hibernate_检索策略(lazy、fetch、batch-size等)

类级别的检索策略无论 元素的 lazy 属性是 true 还是 false, Session 的 get() 方法及 Query 的 list() 方法在类级别总是使用立即检索策略 若 元素的 ...

Hibernate 检索策略 (lazy,batch-size,fetch属性)

以  customer-order为例 一.类级别的检索策略 customer.hbm.xml 注意: 1.lazy=false:立即检索,lazy=true:延时检索    默认...

Hibernate】Hibernate的检索策略:lazy、fetch

http://blog.csdn.net/vking_wang/article/details/8742573 原作者 检索策略 1、类级别和关联级别 ...

【Hibernate】Hibernate的检索策略:lazy、fetch

检索策略 1、类级别和关联级别   可选的检索策略 默认值 受影响的检索方法 类级别 立即检索 延迟检索 延迟 Session.load() ——Session.get()/Query...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)