hibernate抓取策略fetch具体解释
2016-03-23 15:09
417 查看
一、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)保持默认,同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失效。 |
相关文章推荐
- 使用illuminate/html
- jsp前台url传中文参数乱码
- CSS 文字的圆圈背景
- 解决IE下select innerHTML无效的问题
- 安卓与js交互
- 基于jquery编写的放大镜插件
- 【解决方案】如何实现在HTML页面加载完毕后运行某个js
- javascript3
- 13、JSTL简介
- 基本JS表单验证封装类
- twisted转载二即异步编程初探与reactor模式
- Gridview样式的CSS控制
- NodeJs 发送request请求 设置Cookie
- 【jQuery源码】整体架构
- 初始javascript闭包
- JQuery 常用积累(二)Pagination 分页组件
- jsp中想给导入的页面传参数
- Jquery 返回顶部
- javascript基本知识小结--命名空间,函数
- jquery选取自定义属性为已知值的元素