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. iOS几种简单有效的数组排序方法

    第一种,利用数组的sortedArrayUsingComparator调用 NSComparator ,obj1和obj2指的数组中的对象 NSComparator cmptr = ^(id obj1 ...

  2. ASP.NET菜鸟之路之登录系统

    背景 我是一个ASP.NET菜鸟,暂时开始学习ASP.NET,在此记录下我个人敲的代码,没有多少参考价值,请看到的盆友们为我点个赞支持我一下,多谢了. 网站介绍 根据书上的例子做了一个比较粗糙的登录例 ...

  3. python自学笔记

    python自学笔记 python自学笔记 1.输出 2.输入 3.零碎 4.数据结构 4.1 list 类比于java中的数组 4.2 tuple 元祖 5.条件判断和循环 5.1 条件判断 5.2 ...

  4. 制作chm格式的帮助文档

    学习java的人都用过jdk帮助文档,借助工具我们也可以自己生成chm格式的帮助文档, 原文:http://www.cnblogs.com/shenliang123/archive/2012/04/2 ...

  5. ubuntu忘记登录账户以及密码

    笔者在诸多方面仍然是初学者.感兴趣的方面也很多,电脑装上ubuntu14.04也有一段时间了,但仍然在不断学习更多基础的东西. 因为对于命令行界面还有些不习惯,所以一直依赖于图形界面,需要使用终端的时 ...

  6. Linux下的Job Control(转:http://blog.chinaunix.net/uid-26495963-id-3062757.html)

    一.Job的概念 Job是指在批处理的环境中,为完成某一任务而进行一系列操作的总称.在个人接触计算机的年代,批处理的环境已经不容见到了,只有一些特殊的行业和环境下还在使用这样的概念,仅在书本中接触过. ...

  7. jquery实现页面置顶功能代码

    <html> <head> <title></title><script type='text/javascript> //回到顶部功能 f ...

  8. SOLID (面向对象设计) 基本原则

      SOLID (面向对象设计) 基本原则    在 程序设计领域, SOLID (单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特•C•马丁在21世纪早期[1] 引入的记忆术首字母缩略 ...

  9. html中插入flash代码详解(转载)

    <object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://down ...

  10. lua学习-1

    最近打算学习quick cocos2dx,所以首先打算学习一下lua这门语言,Lua 是一个小巧的脚本语言,轻量级,便于扩展. Lua脚本基本的数据类型:nil.boolean.number.stri ...