本章,采用Class和Student     ——  1 对 多的关系;

Student.java:

package com.cy.model;

public class Student {
private int id;
private String name;
private Class c; public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Class getC() {
return c;
}
public void setC(Class c) {
this.c = c;
} }

Class.java:

package com.cy.model;

import java.util.HashSet;
import java.util.Set; public class Class {
private int id;
private String name;
private Set<Student> students = new HashSet<Student>(); public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Student> getStudents() {
return students;
}
public void setStudents(Set<Student> students) {
this.students = students;
} }

Student.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Student" table="t_student">
<id name="id" column="stuId">
<generator class="native"></generator>
</id>
<property name="name" column="stuName"></property> <many-to-one name="c" column="classId" class="com.cy.model.Class" cascade="save-update" lazy="proxy"></many-to-one> </class> </hibernate-mapping>

Class.hbm.xml:

<hibernate-mapping package="com.cy.model">

    <class name="Class" table="t_class">
<id name="id" column="classId">
<generator class="native"></generator>
</id>
<property name="name" column="className"></property> <set name="students" cascade="save-update" inverse="true" lazy="false" batch-size="3" fetch="join">
<key column="classId"></key>
<one-to-many class="com.cy.model.Student" />
</set>
</class> </hibernate-mapping>

第一节:检索策略属性Lazy                                                  

Lazy:true:默认延迟检索:用到才加载

    @Test
public void testLazy1(){
//因为在class.hbm中set端,一对多,配置的是lazy=true,加载class的时候,默认是不加载学生的。
Class c = (Class) session.get(Class.class, 1); //等到什么时候会查询学生数据?——等到他用的时候
//等到用到的时候才去检索,这就是延迟检索
Set<Student> students = c.getStudents(); System.out.println(students.size()); // Iterator it = students.iterator(); }
 
lazy:false: 查询class,如果肯定会用到student信息的话,可以立即检索;设置lazy false也行的
 
lazy:extra:也是延迟的,但是增强的;
比如:配置lazy为true的话,想知道查询出来学生数量的话:
Class c = (Class) session.get(Class.class, 1);
Set<Student> students = c.getStudents();
System.out.println(students.size());
发出的sql为查询所有学生,然后知道3条记录;
但是其实只需要select count(*) from student就行了,这就是sql优化。配置lazy=extra就能实现;
但是实际开发用的也不多,因为很少只查询size的情况;
 
lazy:proxy:
取Student信息的时候,里面的班级Class是代理类,是不包含数据的;但是用到Class里面内容的时候,就通过代理类去数据库查询内容了。
    @Test
public void testLazy2(){
//many to one端,默认lazy - proxy。取出的student中的Class是一个代理类。没有实际数据
Student student = (Student) session.get(Student.class, 1); //等到用到class的名字的时候,代理类才去发出sql查询数据。
student.getC().getName();
}
 
lazy:no-proxy:
没有代理类,取student的时候,里面的class是个null值,等到用class内容了,再去查。很少用.......

第二节:检索策略属性batch-size                                          

1,批量延迟检索;

对应的class.hbm配置:lazy="true" batch-size="3"

/**
* 批量延迟检索,lazy=true
*/
@Test
public void testBatch1(){
List<Class> classList = session.createQuery("from Class").list();
Iterator<Class> it = classList.iterator();
Class c1 = it.next();
Class c2 = it.next();
Class c3 = it.next();
c1.getStudents().iterator();
c2.getStudents().iterator();
c3.getStudents().iterator(); //先取出所有class,因为set students端配置了lazy=false
//等到c1、c2、c3用到student的时候,才去查找。每个发出一条sql语句。
//假如classList很多很多的话,遍历每个class,然后取每个class下面的students,每个都发出一条sql,这样效率就很低了。
//所以,引入了batch-size,批量检索。batch-size的值为批量的值 //在class.hbm. set studens端,配置batch-size=3,发出的sql就是这样了:
/**
* SELECT
t_student.classId ,
t_student.stuId ,
t_student.stuName
FROM t_student
WHERE t_student.classId IN (1, 2, 3)
*/
}

而未设置批量检索batch-size,发出的sql是下面这样,一条一条的查:

设置了批量检索,batch-size=3后,查询student信息时,一次查3条;

2,批量立即检索;

@Test
public void testBatch2(){
List<Class> classList = session.createQuery("from Class").list();
//这里class.hbm.xml set students中配置lazy=false,batch-size=3,就是批量立即检索了.
//发出的批量sql和上面一样。 }

第三节:检索策略属性Fetch                                      

Fetch这里也是在class端配置的;
 
fetch:subselect,在数据量很大的时候,使用子查询,可以使性能得到优化点。
 
@Test
public void testFetch1(){
List<Class> classList = session.createQuery("from Class").list();
Iterator<Class> it = classList.iterator();
Class c1 = it.next();
Class c2 = it.next();
Class c3 = it.next();
c1.getStudents().iterator();
c2.getStudents().iterator();
c3.getStudents().iterator();
/**
* class.hbm set students 配置fetch="select",是默认的,发出的sql:
* SELECT
t_student.classId ,
t_student.stuId ,
t_student.stuName
FROM t_student
WHERE t_student.classId IN (1, 2, 3) 现在改为fetch=subselect:sql变成了:
SELECT
t_student.classId ,
t_student.stuId ,
t_student.stuName
FROM t_student
WHERE t_student.classId IN
(SELECT classId FROM t_class )
*
*/
}

fetch:join:

@Test
public void testFetch2(){
Class c = (Class) session.get(Class.class, 1);
/**
* 这里class.hbm配置:<set name="students" lazy="false" fetch="join">
* 查询班级的时候,把属于这个班级的学生也一起查出来,这里fetch=join,sql中left outer join:
* 发出的sql:
* SELECT
t_class.classId,
t_class.className,
t_student.stuId,
t_student.stuName,
t_student.classId
FROM t_class
LEFT OUTER JOIN t_student ON t_class.classId = t_student.classId
WHERE t_class.classId = 1 * 可以看到只发出一条sql语句了,t_class表和t_student表关联,将class信息和student信息一起取了出来;
*
* 而如果fetch为select,是先取班级信息;再取student信息
*/
}

Hibernate学习9—检索策略的更多相关文章

  1. Hibernate学习之检索策略

    一.类级别的检索策略 类级别可选的检索策略包括立即检索和延迟检索, 默认为延迟检索 –立即检索: 立即加载检索方法指定的对象 –延迟检索: 延迟加载检索方法指定的对象,在使用具体的属性时,再进行加载 ...

  2. Hibernate学习总汇

    Hibernate的基础知识 什么是框架? 什么是Hibernate框架? |--1.应用在javaee三层结构中的dao层 |--2.在dao层里面做对数据库进行crud操作,使用hibernate ...

  3. [原创]java WEB学习笔记88:Hibernate学习之路-- -Hibernate检索策略(立即检索,延迟检索,迫切左外连接检索)

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  4. [原创]java WEB学习笔记91:Hibernate学习之路-- -HQL 迫切左外连接,左外连接,迫切内连接,内连接,关联级别运行时的检索策略 比较。理论,在于理解

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  5. Hibernate学习(八)———— Hibernate检索策略(类级别,关联级别,批量检索)详解

    序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...

  6. Hibernate —— 检索策略

    一.Hibernate 的检索策略本质上是为了优化 Hibernate 性能. 二.Hibernate 检索策略包括类级别的检索策略.和关联级别的检索策略(<set> 元素) 三.类级别的 ...

  7. hibernate学习(6)——加载策略(优化)

    1. 检索方式 1  立即检索:立即查询,在执行查询语句时,立即查询所有的数据. 2 延迟检索:延迟查询,在执行查询语句之后,在需要时在查询.(懒加载) 2.  检查策略 1  类级别检索:当前的类的 ...

  8. hibernate(八) Hibernate检索策略(类级别,关联级别,批量检索)详解

    序言 很多看起来很难的东西其实并不难,关键是看自己是否花费了时间和精力去看,如果一个东西你能看得懂,同样的,别人也能看得懂,体现不出和别人的差距,所以当你觉得自己看了很多书或者学了很多东西的时候,你要 ...

  9. 攻城狮在路上(壹) Hibernate(十二)--- Hibernate的检索策略

    本文依旧以Customer类和Order类进行说明.一.引言: Hibernate检索Customer对象时立即检索与之关联的Order对象,这种检索策略为立即检索策略.立即检索策略存在两大不足: A ...

随机推荐

  1. 2018-2019 2 20165210 《网络对抗技术》Exp5 MSF基础

    2018-2019 2 20165210 <网络对抗技术>Exp5 MSF基础 实验内容: 一个主动攻击实践,如ms08_067(成功); 一个针对浏览器的攻击,如ms10_046(成功) ...

  2. oracle的JOB

    前文再续,上面说的oracle的JOB,近期有些体会,记录一下: 零.创建JOB 创建JOB 1)创建一个存储过程.逻辑处理都在这个存储过程里面. 2)创建一个JOB运行此存储过程 -- 创建tabl ...

  3. PHP常见带有下划线的常量

    1.__PHP_Incomplete_Class <?php echo __PHP_Incomplete_Class::class; ?> __PHP_Incomplete_Class 2 ...

  4. U盘传送容量与格式问题

    问题 今天想将7.6G的文件拷到U盘里,提示u盘内存不足,其实内存为14+G. 解答 U盘格式对于U盘的传送大小有限制 下面为U盘三种不同格式的应用及优缺点 FAT32格式:为系统默认格式,具有极佳的 ...

  5. 【集成学习】lightgbm使用案例

    github地址 #!/usr/bin/env python2 # -*- coding: utf-8 -*- """ Created on Sat Mar 31 21: ...

  6. [QT]数据库SQLITE使用错误记录

    1.仿照创建数据库的例程编写代码,出现以下问题: ① 创建QSqlQuery query;   注意:这里没有将 query 与 QSqlSatabase db, 关联,正确的应该是 : QSqlQu ...

  7. ubuntu安装依赖:0.8.1-1ubuntu4.4 正要被安装以及vm nested解决方法

    刚才在ubuntu10.04虚拟机上安装kvm,提示0.8.1-1ubuntu4.4 正要被安装,查了一下,有一种解决方法: 进入“系统->系统管理->更新管理器->设置”,在弹出的 ...

  8. ios逆向工程-内部钩子(Method Swizzling)

    Method Swizzling(方法调配) 怎么说呢,先了解什么是钩子为什么用钩子,学过C++的朋友应该清楚,hook就是用来获得(截断/改变)底层调用的方法.这样我们可以自由的修改或者读取一些想要 ...

  9. Codeforces 815C. Karen and Supermarket【树形DP】

    LINK 思路 首先发现依赖关系是一个树形的结构 然后因为直接算花多少钱来统计贡献不是很好 因为数组开不下 那就可以算一个子树里面选多少个的最小代价就可以了 注意统计贡献的时候用优惠券的答案只能在1号 ...

  10. BZOJ2694 Lcm 【莫比乌斯反演】

    BZOJ2694 Lcm Description Input 一个正整数T表示数据组数 接下来T行 每行两个正整数 表示N.M Output T行 每行一个整数 表示第i组数据的结果 Sample I ...