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的更多相关文章

  1. Hibernate的fetch (转)

    fetch ,可以设置fetch = "select" 和 fetch = "join" 用一对多来举例: fetch = "select" ...

  2. FW: How to use Hibernate Lazy Fetch and Eager Fetch Type – Spring Boot + MySQL

    原帖 https://grokonez.com/hibernate/use-hibernate-lazy-fetch-eager-fetch-type-spring-boot-mysql In the ...

  3. Hibernate - lazy, fetch, inverse, cascade

    Inverse是hibernate双向关系中的基本概念.inverse的真正作用就是指定由哪一方来维护之间的关联关系.当一方中指定了"inverse=false"(默认),那么那一 ...

  4. hibernate中fetch lazy

    join 查询的时候,是用一条语句查处所有记录,包括关联表记录, select查出的是N+1条记录,两个都是差不多的,但是如果用了lazy=true,延迟加 载的话,select在查询时只会查出主表记 ...

  5. Hibernate中fetch和lazy介绍

    fetch ,指定关联对象抓取的方式,可以设置fetch = "select" 和 fetch = "join".select方式时先查询返回要查询的主体对象( ...

  6. hibernate 中 fetch=FetchType.LAZY 懒加载失败处理

    对这种懒加载问题,最后的做法是利用Spring提供的一个针对Hibernate的一个支持类,其主要意思是在发起一个页面请求时打开Hibernate的Session,一直保持这个Session,使得Hi ...

  7. Hibernate中得fetch

    fetch ,可以设置fetch = "select" 和 fetch = "join" 用一对多来举例:fetch = "select"是 ...

  8. 11.hibernate的连接查询

    1.创建如下javaweb项目结构 2.在项目的src下创建hibernate.cfg.xml主配置文件 <?xml version="1.0" encoding=" ...

  9. HQL: The Hibernate Query Language

    Chapter 14. HQL: The Hibernate Query Language 14.1. Case Sensitivity 14.2. The from clause 14.3. Ass ...

随机推荐

  1. Character Encoding tomcat.

    default character encoding of the request or response body: If a character encoding is not specified ...

  2. NSString&NSMutableString常用操作梳理(转)

    作者:弦苦 授权本站转载. 上一篇梳理了NSArray&NSMutableArray常用操作,这次来梳理一下Objective-C中每天都要用到的字符串处理类——NSString. Objec ...

  3. 七、C# 接口

    并非只能通过继承使用多态性,还能通过接口使用它. 和抽象类不同,接口不包含任何实现(方法). 然后和抽象类相似,接口也定义了一系列成员,调用者可以依赖这些成员来支持一个特定的功能.   实现接口的类会 ...

  4. Puer是一个可以实时编辑刷新的前端服务器

    ##Puer是一个可以实时编辑刷新的前端服务器 确保你安装了nodejs(现在还有没nodejs环境的前端? 拖出去喂狗吧) 使用npm全局安装puer命令 npm install puer -g 输 ...

  5. IOS开发之UIScrollView

    一.UIScrollView的边界处理问题: bounds属性: (1)当bounces属性设置为YES时,当UIScrollView中图片滑动到边界的时候会出现弹动的效果,就像是Linux中的果冻效 ...

  6. ASP.Net MVC4排序检索分页的实现

    前言 上一节我们做到了如下的一个基础查询页面.本节我们向这个页面中加入排序.搜索和分页功能. 排序 从上图中的地址栏中可以看到这个页面调用的是Company Controller下的Index Act ...

  7. ueditor 1.4.3.2 独立/单独 上传图片框原理

    其实简单的说就是编辑框很多按钮,所有按钮的功能都是以command形式提供,所以execCommand就是执行这些功能的命令.有些按钮是能弹出显示一个对话框,他的基类就是dialog,而所有被弹出的d ...

  8. 初涉JavaScript模式 (2) : 基本技巧

    尽量少用全局变量 大量使用全局变量会导致的后果 全局变量创建以后会在整个JavaScript应用和Web页面中共享.所有的全局变量都存在于一个全局命名空间内,很容易发生冲突 不知不觉创建了全局变量 其 ...

  9. 字符串截取slice() substring() substr()的区别?

    获取子字符串 slice()        substr()    substring() 不会修改字符串本身,他们只是返回一个基本类型的字符串值 var str='abcdefghijklmn'; ...

  10. js监听回车事件

    标题通俗的说,也就是绑定当用户按下回车键要执行的事件. 下面,入正题. 第一步,先编写简单的页面代码,这里我们只需要一个按钮就足够了.当然,还有按钮事件. <html> <head& ...