懒加载测试:      
     /*类的延迟加载
      *
* session.get
* 1、方法加载出来的对象是class对象
* 2、在session.get方法执行的时候发出sql语句
* 3、class对象是有值的
* session.load
* 1、方法加载出来的对象是class的代理对象
* 2、在加载其属性的时候发出sql语句(按照需求加载,延迟加载)
* 3、获取标识符属性是不用延迟加载的,获取普通属性是需要发出sql语句的
* 标识符属性对于延迟加载不起作用
*/
映射文件: Class.hbm.xml
实体类: Class
Hibernate类的延迟加载测试:
Configuration configuration = new Configuration();
configuration.configure("com/hibernate/lazy/hibernate.cfg.xml");
sessionFactory = configuration.buildSessionFactory();
ClassLazyTest:
session.get(CLass.class,1L); session.close();
session.load(CLass.class,1L); session.close(); /*
* session.get
* 1、方法加载出来的对象是class对象
* 2、在session.get方法执行的时候发出sql语句
* 3、class对象是有值的
session.load
* 1、方法加载出来的对象是class的代理对象
* 2、在加载其属性的时候发出sql语句(按照需求加载,延迟加载)
* 3、获取标识符属性是不用延迟加载的,获取普通属性是需要发出sql语句的标识符属性对于延迟加载不起作用
*/ ReferenceRelationTest:
Class user =(Class)session.get(Class.class,1L);
Set<Student> student = user.getStudents();
for(Student stu : student)
{
System.out.println(stu.getName());
}
seesion.close(); 深入:
/*
* 当集合的lazy为true时
* Hibernate: select students0_.cid as cid0_1_, students0_.sid as sid1_, students0_.sid as sid1_0_, students0_.sname as sname1_0_, students0_.cid as cid1_0_ from student students0_ where students0_.cid=?
* 当集合的lazy为extra时 extra为更进一步的延迟加载
* Hibernate: select count(sid) from student where cid =?
*/

  那什么时候使用懒加载? 处理大数据量时,为了减少对数据库的查询次数和对数据的取舍(有些没用到的关联数据夜查出来了),这时候就应当使用它。

抓取策略:

部分代码测试贴上:

/*
* 抓取策略
* 例子:在加载class的时候怎么样去加载student
* 应用范围:在加载一端对象的时候,去加载多的一端对象的时候的方式
*      抓取策略和延迟加载----->研究对象是集合,这一点应该不难理解,懒加载是在一对多/多对多关联中,从的一方拿数据是否延迟加载多的那方。 抓取策略则是操作者本身已经明确了需要获取哪些数据,并且是在关联关系简单生成的SQL语句却很多,针对的也是一对多/多对多的关系
* lazy fetch
* false select   有作用
* true join 延迟加载失效
* false subselect  有作用
*
* 总结:当fetch为join时,延迟加载失去作用
* 当fetch为select时或者为subselect时,延迟加载能控制sql语句的发出时间
*
*/
public class FetchTest {
private static SessionFactory sessionFactory = null;
static {
Configuration configuration = new Configuration();
configuration.configure("cn/heima5/hibernate/fetch/hibernate.cfg.xml");
sessionFactory = configuration.buildSessionFactory();
} /*
* 先查询所有的class数据,再根据class查询student,其本身的查询符合子查询
* 所以在这个例子中,可以用fetch="subselect"提高效率 1、如果用fetch="select"将导致n+1次查询
* n代表class表中的行数 2、用fetch="join"不起作用
* 3、应用fetch="subselect"或者fetch="select"与batch-size结合起来使用
*/
@Test
public void testQuery() {
Session session = sessionFactory.openSession(); List<Class> classList = session.createQuery("from Class").list(); for (Class class1 : classList) {
Set<Student> students = class1.getStudents();
for (Student student : students) {
System.out.println(student.getSname());
}
} session.close();
}
/*
* 说明
* 1、如果fetch="select"发出两条sql语句
* 第一条查询给定的ID的值的class对象
* 第二条查询根据cid查询student
* 2、如果fetch="join",发出一条sql语句 左外连接
*/
@Test
public void testQuery2() {
Session session = sessionFactory.openSession(); Class class1 = (Class)session.get(Class.class, 1L); Set<Student> students = class1.getStudents();
for (Student student : students) {
System.out.println(student.getSname());
} session.close();
}
/*
* 通过分析属于子查询的内容,所以抓取策略为fecth="subselect"
*/
@Test
public void testQuery3(){
Session session = sessionFactory.openSession(); List<Class> classList = session.createQuery("from Class where cid in(1,2,3,5,7)").list(); for (Class class1 : classList) {
Set<Student> students = class1.getStudents();
for (Student student : students) {
System.out.println(student.getSname());
}
} session.close();
}
总结:当fetch为join时,延迟加载失去作用
   当fetch为select时或者为subselect时,延迟加载能控制sql语句的发出时间

    

Session缓存:

后续更新

Hibernate-缓存/懒加载/抓取策略的更多相关文章

  1. hibernate detached分离查询 与 抓取策略注意事项

    1.detached在抓取策略为 jion显式左外连接查询情况下 会产生笛卡儿积现象 DetachedCriteria dc = DetachedCriteria.forClass(Topic.cla ...

  2. hibernate的懒加载问题

    产生原因: 当使用hibernate查询一个对象的时候,如果Session关闭,再调用该对象关联的集合或者对象的时候,会产生懒加载异常! 解决方案: 方案一: 在Session关闭之前,查询对象关联的 ...

  3. Hibernate的懒加载session丢失解决方法

    在web.xml加入spring提供的过滤器,延长session的生命周期 <!--Hibernate的懒加载session丢失解决方法 --> <filter> <fi ...

  4. Hibernate学习笔记(八) — 懒载入与抓取策略

    懒载入(Load On Demand)是一种独特而又强大的数据获取方法,它可以在用户滚动页面的时候自己主动获取很多其它的数据,而新得到的数据不会影响原有数据的显示,同一时候最大程度上降低server端 ...

  5. hibernate的懒加载

    WHY? WHAT? HOW? 所谓懒加载(lazy)就是延时加载,延迟加载.即不是不加载,而是在需要的时候才加载. 什么时候用懒加载呢,我只能回答要用懒加载的时候就用懒加载. 至于为什么要用懒加载呢 ...

  6. 【转】Hibernate 原汁原味的四种抓取策略

    最近在研究 Hibernate 的性能优化的时候碰到了"抓取策略", 由于以前没有详细的研究过, 所以到处找资料, 但是无论从一些讲 Hibernate 书籍,还是他人 Blog ...

  7. Hibernate 原汁原味的四种抓取策略(转)

    原文出处:http://www.cnblogs.com/rongxh7/archive/2010/05/12/1733088.html     尊重原作者,访问原创地址 最近在研究 Hibernate ...

  8. hibernate+spring mvc, 解决hibernate 对象懒加载 json序列化问题

    引用地址 在使用Spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") ...

  9. hibernate+spring mvc,解决hibernate对象懒加载,json序列化失败

    在使用spring MVC时,@ResponseBody 注解的方法返回一个有懒加载对象的时候出现了异常,以登录为例: @RequestMapping("login") @Resp ...

随机推荐

  1. maven 打包不全(xml,properties文件没打进包)解决方案

    在pom.xml的build标签中加入以下代码即可 <build> <resources>            <resource>               ...

  2. docker集群——初识Swarm

    为Docker构建原生的集群管理工具的计划早在2014年初就开始了,当时作为一个通信协议项目,称为Beam.之后,它被实现为一种后台程序,使用Docker API来控制异构化的分布式系统.项目重新命名 ...

  3. LoadRunner测试Google Suggest

    Google的搜索框是典型的AJAX应用,用户在输入关键字的同时,前端页面通过xmlhttp与后台服务器动态交互,根据用户输入的关键字查找匹配的内容,向用户提示建议的搜索项,也就是所谓的“google ...

  4. 经验总结54--搭建linux虚拟机环境

    好久没写博客了.写一篇环境搭建吧. 自己做java,有时会接触linux环境,自己能够搭建一个,方便自己做实验和学习. 1.下载VM11. 下载并依照VM:http://rj.baidu.com/so ...

  5. 【Java】Java_10 常量与变量

    1.变量(variable) 1.1 我们通过变量来操纵存储空间中的数据,变量就是指代这个存储空间!空间位置是确定的,但是里面放置什么值不确定! 1.2 Java是一种强类型语言,每个变量都必须声明其 ...

  6. windows系统下GCC的安装与配置

    刚开始看 C++ Primer,看到编译器的部分,自己搜了搜怎么搭建GCC,搜到以下内容,复制过来留个印象: windows系统下GCC的安装方法,以及一些环境变量的配置,如果对GCC不是很清楚,关于 ...

  7. Atitit.linq java的原理与实现 解释器模式

    Atitit.linq java的原理与实现 解释器模式 1. Linq  from  where 的实现1 2. Where expr 的实现1 3. Attilax的一点变化2 4. 解释器模式的 ...

  8. nginx日志配置指令详解

    这篇文章主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下日志对于统计排错来说非常有利的.本文总结了nginx日 ...

  9. 1. Two Sum【easy】

    1. Two Sum[easy] Given an array of integers, return indices of the two numbers such that they add up ...

  10. 浅谈一致性hash

    相信做过互联网应用的都知道,如何很好的做到横向扩展,其实是个蛮难的话题,缓存可横向扩展,如果采用简单的取模,余数方式的部署,基本是无法做到后期的扩展的,数据迁移及分布都是问题,举个例子: 假设采用取模 ...