假设现在有Book和Category两张表,表的关系为双向的一对多,表结构如下:

  假设现在我想查询id为2的那本书的书名,使用session.get(...)方法:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.get(Book.class,2);
3 System.out.println(book.getName());

  当执行完第二行代码,还未执行第三行时,控制台已经打印出了sql语句,执行第三行时打印出书名"斗破苍穹".

  而如果使用session.load(..)查询时:

1 Session session=HibernateUtil.getSession();
2 Book book =(Book) session.load(Book.class,1);
3 System.out.println(book.getName());

  当执行完第二行代码还未执行第三行时,控制台什么都没有打印,执行第三行时,控制台打印出sql语句和书名"斗破苍穹".

  看出get和load的区别了吗?

  实际上,当使用get方法查询时,程序立即去访问数据库(实际上是先去一级缓存session中查询,没有发现的话再去二级缓存,再没有的话才去访问数据库),得到id=2的Book,并且打印出sql语句,而是用load方法查询时,load并未立即去访问数据库,他先是返回了一个Book的代理对象,当你真正要用到Book中信息时,才去访问数据库.load支持延迟加载,get不支持延迟加载,当然如果设置了lazy=false,get和load都会直接去访问数据库,都变成即时加载.

  get/load方法还有一个很重要的区别就是:

    load方式检索不到的话会抛出org.hibernate.ObjectNotFoundException异常
    get方法检索不到的话会返回null

  这就引出了即时加载和延时加载的概念,通俗的说,即时加载,就是立即去数据库查找,延迟加载,就是真正需要的时候才去数据库查找,这类似于单例模式中的懒汉式和饿汉式的加载方式.

  假设我现在想通过查询Book,来得到Book所对应的Category,如果设置为即时加载,当加载Book时,会自动加载Category,如果设置为延迟加载,则加载Book时,不会加载Category,只有当第一次调用getCategory(),时,才去执行sql语句,加载Category.

  一般来说,延迟加载要比即时加载节省资源,但是如果处理不当,延迟加载容易抛出延迟加载异常(LazyInitializationException).这是因为延迟加载时,只有第一次调用getCategory()时才会加载Category数据,如果这时候数据库连接已经关闭了,就会因为无法加载数据而抛出异常.

  在*.hbm.xml中可以设置加载方式,class标签中可以设置:lazy="true",打开延迟加载,默认就是lazy="true".

  在set/bag标签下,默认也是lazy="true",支持延迟加载,也叫懒加载.

  单端关联(many_to_one或者one_to_one)上也可以设置lazy="true".默认也是true支持懒加载.

下面是网络上一段关于get和load方法的详细异同,写的不错,贴在这里:

 一、get和load方法都是根据id去获得对应数据的,但是获得机制不同:如果使用get方法,hibernate会去确认该id对应的数据是否存在,它首先会去session中去查询(session缓存其实就hibernate的一级缓存),如果没有,再去二级缓存中去查询,如果再没有,就去数据库中查询,仍然没有找到的话,就返回null

  而使用load方法的话,hibernate会认定该id对应的数据一定存在,它也会先去session缓存中去查找,如果没有找到,hibernate会根据lazy属性值来确定是否使用延迟加载。如果lazy=‘true’ ,就使用延迟加载,返回该代理对象,等到真正访问到该对象的属性时才会去二级缓存中查询,如果没有,再去数据库中查询,如果还没有,就抛出org.hibernate.ObjectNotFoundException异常。如果lazy='false' 则不使用延迟加载,这是load的访问机制就和get一样了。

  二、对于load和get方法返回类型:虽然好多书中都这么说:“get()永远只返回实体类”,但实际上这是不正确的,get方法如果在 session缓存中找到了该id对应的对象,如果刚好该对象前面是被代理过的,如被load方法使用过,或者被其他关联对象延迟加载过,那么返回的还是 原先的代理对象,而不是实体类对象,如果该代理对象还没有加载实体数据(就是id以外的其他属性数据),那么它会查询二级缓存或者数据库来加载数据,但是 返回的还是代理对象,只不过已经加载了实体数据。


抓取策略:

  在hibernate的官方文档中对于抓取策略,是这么定义的:

当应用程序需要在(hibernate实体对象图的)关联关系间进行对象导航的时候,hibernate如何获取关联对象的策略.

fetch="select":当查询关联对象通过select语句去查询,Select语句的发出时机,是根据lazy的值来确定的,如果lazy="false",那么在获取对象时,就会发出一条select语句,将关联对象查询出来,就是说,我们在查询Book信息的时候会自动把Category的数据也查询出来,但如果lazy="true",那么只有在获取关联对象的时候才会发出select语句去查询.

fetch="join":当查询Book信息时,会通过outer join把关联的对象Category一起查询出来,这个时候lazy无效,所有数据会立即查询出来.

fetch="subselect":如果要查询关联集合的内容,会查询之前已经查询出来的所有关联集合的内容,<category对应了多张Book,如果查询了"玄幻类","武侠类",那么在使用"玄幻类"和"武侠类"对应的集合对象("所对应的书籍信息"),会将他们的书籍信息一并查询出来,

Hibernate之加载策略(延迟加载与即时加载)和抓取策略(fetch)相关推荐

  1. Hibernate抓取策略

    为什么80%的码农都做不了架构师?>>>    6.抓取策略:抓取策略主要是指获取连接对象的策略. 6.1.基于XML的抓取 1.1.基于XML抓取many-to-one sessi ...

  2. JAVAWEB开发之Hibernate详解(三)——Hibernate的检索方式、抓取策略以及利用二级缓存进行优化、解决数据库事务并发问题

    Hibernate的检索方式  Hibernate提供了以下几种检索对象的方式: 导航对象图检索方式:根据已经加载的对象导航到其他对象. OID检索方式:按照对象的OID来检索对象. HQL检索方式: ...

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

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

  4. hibernate教程--抓取策略详解

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  5. hibernate教程--抓取策略

    Hibernate的抓取策略 1.1. 区分延迟和立即检索: 立即检索: * 当执行某行代码的时候,马上发出SQL语句进行查询. * get() 延迟检索: * 当执行某行代码的时候,不会马上发出SQ ...

  6. Hibernate 中集合对象的抓取策略(Fetching strategies)

    Product.java 代码: package com.b510.examples; /**  * Product entity. @author MyEclipse Persistence Too ...

  7. BASLER Pylon 抓取策略

    One by One Grab Strategy 逐个抓取策略 当使用 one by one 抓取模式时,图像按其获取顺序处理. 相机抓取引擎实例将空缓存队列中的缓存取消,并将空缓存排入低级别API流 ...

  8. js的阻塞加载、延迟加载和异步加载

    1.阻塞加载: 平常默认使用的都是阻塞加载.例如:                                        阻塞加载会阻止浏览器的后续处理,停止了后续的文件的解析,执行,如图像的 ...

  9. 蜘蛛爬虫的抓取策略有哪些呢?

    数据抓取系统是搜索引擎重要组成的系统之一,主要负责互联网信息的搜集.保存和更新等等,他就像蜘蛛一样在互联网中爬来爬去,所以叫做蜘蛛爬虫. 搜索引擎蜘蛛抓取页面的时候,会从一些重要的页面开始,通过内链来 ...

最新文章

  1. R语言ggplot2时间序列可视化并在特定日期处添加竖线实战
  2. 赔腾讯70万,QQ“自动抢红包”软件被判不正当竞争
  3. BCH推出BCH粉丝互动平台
  4. VMware / 三种联网方法及原理
  5. 【笔记】springboot+spring security登录流程实现
  6. 推荐系统实践:从多领域优化到AutoML框架
  7. ai故障风字体_一分钟就能学会!用PPT做出抖音故障风的字体特效
  8. SqlServer数据库导入 mdf,ldf,ndf 格式文件操作
  9. 牛牛卡牌游戏 javascript
  10. leetcode675. Cut Off Trees for Golf Event(Hard)
  11. char类型数据说明
  12. leetcode#66. Plus One
  13. Qt开发学生信息管理系统
  14. redis存10万条数据_redis如何存储数据
  15. 易语言永久修改窗口标题
  16. 蔚来汽车3年亏超百亿,只能靠上市来融钱交车?
  17. 拨号服务器是什么,有什么用处?
  18. 多元高斯分布是非参_多元高斯分布(多元正态分布)简介
  19. 【重新定义matlab强大系列三】MATLAB清洗离群数据(查找、填充或删除离群值)
  20. android 调用系统相机拍照保存,android 调用系统照相机,保存后回到前一个activity...

热门文章

  1. MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级
  2. java placeholder_java – 如何在JTextfield中设置像Placeholder一样的文本
  3. java图形用户登录界面_Java简单登录图形界面
  4. 视频领域的Instagram:Viddy用户突破2600万
  5. STL中map和string, vector 用法详解
  6. 在Window下编译OpenH323
  7. VUE:兄弟组件间传参
  8. git 查看远程仓库地址
  9. Web Service 简单实例(java 版本) ,IDE自动生成客户端代码方法
  10. FreeSql (二十四)Linq To Sql 语法使用介绍