`

Hibernate的fetch

 
阅读更多

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

Student student = (Student) session.get(Student.class, 43);
			
System.out.println("student name  "+student.getName());
			
System.out.println("class name    "+student.getClasses().getName());

 

1)保持默认,同fetch="select",如:

<many-to-one name="classes" column="classesid" fetch="select"/>

 

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


执行结果:2条语句

Hibernate: select student0_.id as id1_0_, student0_.name as name1_0_, student0_.class_id as class3_1_0_ from student student0_ where student0_.id=?

student name  ccc 

Hibernate: select myclass0_.id as id0_0_, myclass0_.name as name0_0_ from class myclass0_ where myclass0_.id=?

class name    09002

 
2)设置fetch="join",如:

<many-to-one name="classes" column="classesid" fetch="join"/>

 

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

执行结果:一条join语句

Hibernate: select student0_.id as id1_1_, student0_.name as name1_1_, student0_.class_id as class3_1_1_, myclass1_.id as id0_0_, myclass1_.name as name0_0_ from student student0_ inner join class myclass1_ on student0_.class_id=myclass1_.id where student0_.id=?

student name  ccc
class name    09002

 二、hibernate抓取策略(集合代理的批量抓取,fetch=select(默认)/join/subselect)

测试用例:

MyClass class1 = (MyClass) session.load(MyClass.class, 28);
			
         System.out.println("班级名:" + class1.getName());

         Set<Student> students = class1.getStudents();
         System.out.println("班级人数:" + students.size());
			
                   if (students != null && !students.isEmpty()) {
				
                         Iterator<Student> iterator = students.iterator();
	       System.out.print("学生姓名:");
				
                          while (iterator.hasNext()) {
					
                                               Student student = iterator.next();
					
                                                System.out.println(student.getName());
				}
			}

 

1)保持默认,同fetch="select",如:

<set name="students" inverse="true" fetch="select">

 

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

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

Hibernate: select myclass0_.id as id0_0_, myclass0_.name as name0_0_ from class myclass0_ where myclass0_.id=?
班级名:09002

Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=?
班级人数:3
学生姓名:ccc
bbb
aaa

 

(2)设置fetch="join",如:

<set name="students" inverse="true" fetch="join">

 

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

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

Hibernate: select myclass0_.id as id0_1_, myclass0_.name as name0_1_, students1_.class_id as class3_0_3_, students1_.id as id3_, students1_.id as id1_0_, students1_.name as name1_0_, students1_.class_id as class3_1_0_ from class myclass0_ left outer join student students1_ on myclass0_.id=students1_.class_id where myclass0_.id=?
班级名:09002
班级人数:3
学生姓名:aaa
ccc
bbb

 (3)设置fetch="subselect",如:用在查询语句中

<set name="students" inverse="true" fetch="subselect">

 

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

测试用例:

List<MyClass> classes = session.createQuery("from MyClass where id in (27,28,29)").list();
			
            Iterator<MyClass> iterator1 = classes.iterator();
			
              while(iterator1.hasNext()){
				
                 MyClass class1 = iterator1.next();
				
                 System.out.println("班级名:" + class1.getName());

				
                  Set<Student> students = class1.getStudents();
				
                  System.out.println("班级人数:" + students.size());
				
                   if (students != null && !students.isEmpty()) {
					
                         Iterator<Student> iterator = students.iterator();
					
                         System.out.print("学生姓名:");
					
                         while (iterator.hasNext()) {
						
                              Student student = iterator.next();
                              System.out.println(student.getName());
					}
				}
				
			}

 

 

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

结果如下:执行了4条查询语句,其中有3条关联查询语句。

Hibernate: select myclass0_.id as id0_, myclass0_.name as name0_ from class myclass0_ where myclass0_.id in (27 , 28 , 29)
班级名:09002
Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=?
班级人数:0

班级名:09003
Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=?
班级人数:3
学生姓名:ccc
aaa
bbb

班级名:09004
Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id=?
班级人数:3
学生姓名:ccc
bbb
aaa

 

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

执行了2条查询语句,其中有1条子查询语句(嵌套子查询)

Hibernate: select myclass0_.id as id0_, myclass0_.name as name0_ from class myclass0_ where myclass0_.id in (27 , 28 , 29)
班级名:09002
Hibernate: select students0_.class_id as class3_0_1_, students0_.id as id1_, students0_.id as id1_0_, students0_.name as name1_0_, students0_.class_id as class3_1_0_ from student students0_ where students0_.class_id in (select myclass0_.id from class myclass0_ where myclass0_.id in (27 , 28 , 29))
班级人数:0
班级名:09003
班级人数:3
学生姓名:ccc
aaa
bbb
班级名:09004
班级人数:3
学生姓名:bbb
ccc
aaa

 

总结:

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

    Hibernate fetch lazy cascade inverse 关键字

    优化Hibernate性能的几点建议

    中取出的记录条数,一般设置为30、50、100.Oracle数据库的JDBC驱动默认的Fetch Size=15,设置Fetch Size设置为:30、50,性能会有明显提升,如果继续增大,超出100,性能提升不明显,反而会消耗内存。 即在...

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

    主要介绍了hibernate 中 fetch=FetchType.LAZY 懒加载失败处理方法,需要的朋友可以参考下

    Hibernate配置各种数据源详解

    Hibernate配置各种数据源 &lt;hibernate-configuration&gt; &lt;!– 各属性的配置–&gt; &lt;!—为true表示将Hibernate发送给...”jdbc.fetch_size”&gt;50 &lt;!– 设定对数据库进行批量删除 –&gt; ”jdbc.batch_size”&gt;30&lt;/property&gt;

    Hibernate3.2学习笔记

    Hibernate环境搭建 Hibernate主要接口 Hibernate主要映射 Hibernate的lazy、fetch、cascade等策略 Hibernate性能优化

    Hibernate+中文文档

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     16.3.5 用带子查询的select语句整批量初始化orders集合(fetch属性为“subselect”)  16.3.6 迫切左外连接检索(fetch属性为“join”)  16.4 多对一和一对一关联的检索策略  16.4.1 迫切左外连接检索(fetch...

    hibernate.properties

    hibernate.max_fetch_depth 1 ## set the default batch size for batch fetching #hibernate.default_batch_fetch_size 8 ## rollback generated identifier values of deleted entities to default values #...

    hibernate3.2中文文档(chm格式)

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    HibernateAPI中文版.chm

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    Hibernate教程15_关联关系中的CRUD Cascade_Fetch

    http://blog.csdn.net/e421083458/article/details/8794127 该源码为Hibernate教程配套源码

    Hibernate中文详细学习文档

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    Hibernate 中文 html 帮助文档

    19.1.2. 调整抓取策略(Tuning fetch strategies) 19.1.3. 单端关联代理(Single-ended association proxies) 19.1.4. 实例化集合和代理(Initializing collections and proxies) 19.1.5. 使用批量抓取(Using...

    最全Hibernate 参考文档

    19.1.1. 调整抓取策略(Tuning fetch strategies) 19.1.2. 单端关联代理(Single-ended association proxies) 19.1.3. 实例化集合和代理(Initializing collections and proxies) 19.1.4. 使用批量抓取(Using...

    SSH笔记-检索策略(lazy、fetch、batch-size)

    hibernate的类级别检索策略和检索策略的lazy、fetch、batch-size属性使用

    hibernate总结

    i. 如果不加fetch关键字,则hibernate不会抓取关系属性,但会遍历关系属性所对应的表 ii. 不加fetch关键字时,select 要指定返回的对象,否则它要返回数组 iii. 条件:持久化类之间有关系属性映射 Hibernate级联...

    Hibernate注释大全收藏

    @Basic(fetch = FetchType.LAZY) String getDetailedComment() { ... } // persistent property @Temporal(TemporalType.TIME) java.util.Date getDepartureTime() { ... } // persistent property @Enumerated(Enum...

    hibernate 体系结构与配置 参考文档(html)

    1. Hibernate入门 1.1. 前言 1.2. 第一部分 - 第一个Hibernate应用程序 1.2.1. 第一个class 1.2.2. 映射文件 1.2.3. Hibernate配置 1.2.4. 用Ant构建 1.2.5. 启动和辅助类 1.2.6. 加载并存储对象 1.3. 第...

    Hibernate注解

    fetch指定是否延迟加载,值为FetchType.LAZY表示延迟,为FetchType.EAGER表示立即加载 * 方法一 使用这种配置,在为“一端”添加“多端”时,不会修改“多端”的外键。在“一端”加载时,不会得到“多端”。如果使用...

Global site tag (gtag.js) - Google Analytics