Hibernate的Session在加载一个Java对象时,可以将与这个对象相关联的其他Java对象都加载到缓存中,以便程序及时调用。但有些情况下,我们不需要加载太多无用的对象到缓存中,一来这样会撑爆内存,二来增加了访问数据库的次数。所以为了合理的使用缓存,Hibernate提供了几种检索策略来供用户选择。

Hibernate的检索策略

在Hibernate中主要有三种检索策略,它们是立即检索策略、延迟检索策略、左外连接检索策略。下面分别介绍一下这三种检索策略。

立即检索策略

采用立即检索策略,会将被检索的对象,以及和这个对象关联的一对多对象都加载到缓存中。Session的get方法就使用的立即检索策略。

优点:频繁使用的关联对象能够被加载到缓存中。

缺点:1、占用内存。2、Select语句过多。

延迟检索策略

采用延迟检索策略,就不会加载关联对象的内容。直到第一次调用关联对象时,才去加载关联对象。在不涉及关联类操作时,延迟检索策略只适用于Session的load方法。涉及关联类操作时,延迟检索策略也能够适用于get,list等操作。

在类级别操作时, 延迟检索策略,只加载类的OID不加载类的其他属性,只用当第一次访问其他属性时,才回访问数据库去加载内容。(这里使用了CGLIB生成了类的代理类)

在关联级别操作时,延迟检索策略,只加载类本身,不加载关联类,直到第一次调用关联对象时,才去加载关联对象

程序模式都是用延迟加载策略。如果需要指定使用延迟加载策略。在配置文件中设置<class>的lazy=true,<set>的lazy=true或extra(增强延迟)<many-to-one>的lazy=proxy和no-proxy。

优点:由程序决定加载哪些类和内容,避免了大量无用的sql语句和内存消耗。

缺点:在Session关闭后,就不能访问关联类对象了。 需要确保在Session.close方法前,调用关联对象。

左外连接检索策略:

采用左外连接检索,能够使用Sql的外连接查询,将需要加载的关联对象加载在缓存中。

<set>fetch设置为join,<many-to-one>的fetch设置为 join

优点:1.对应用程序完全透明,不管对象处于持久化状态,还是游离状态,应用程序都可以方便的从一个对象导航到与它关联的对象。2.使用了外连接,select语句数目少。

缺点:1.可能会加载应用程序不需要访问的对象,白白浪费许多内存空间。2.复杂的数据库表连接也会影响检索性能。

batch-size属性:

无论是立即检索还是延迟检索,都可以指定关联查询的数量,这就需要使用batch-size属性来指定,指定关联查询数量,以减少批量检索的数据数目。

转载于:https://www.cnblogs.com/wukong0214/archive/2013/01/23/2874026.html

Hibernate的检索策略相关推荐

  1. Hibernate之检索策略

    1.概述 检索数据时的2个问题: 不浪费内存:当Hibernate从数据库中加载Customer对象时,如果同时加载所有关联的Order对象,而程序仅仅需要访问Customer对象,那么关联的Orde ...

  2. Hibernate框架--学习笔记(下):hibernate的查询方式、多表查询、检索策略、批量抓取

    一.hibernate的查询方式: 主要有五种:对象导航查询:OID查询:hql查询:QBC查询:本地sql查询. 1.对象导航查询:根据id查询某个客户,再查询这个客户里面所有的联系人. 2.OID ...

  3. hibernate 插入 效率_Hibernate:检索策略的学习1

    概述 检索数据,也就是查询数据是在一个系统中必不可少的一个功能.检索数据时的2个问题: 不浪费内存:例如,Customer和Order是双向1-N的关系.当 Hibernate 从数据库中加载 Cus ...

  4. (九)Hibernate 检索策略

    所有项目导入对应的hibernate的jar包.mysql的jar包和添加每次都需要用到的HibernateUtil.java 这里的hibernate.cfg.xml配置信息我就不再写了 第一节:检 ...

  5. 10、Hibernate的对象检索策略

    - 立即检索策略 - 延迟检索策略 - 左外连接检索策略 - 每种检索策略的适用范围 - 在程序中显式指定左外连接检索策略 表字段之间的对应关系 1.运行Session的方法 List custome ...

  6. Hibernate的三种检索策略

    1 N+1问题 Hibernate的Session缓存中存放的是相互关联的对象图,默认情况下,当从数据库中加载一个对象的时候,会同时加载它所关联的其他对象.例如:Clazz(班级)跟Student(学 ...

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

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

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

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

  9. Hibernate之检索方式(HQL/QBC/本地SQL)

    一.概述 Hibernate提供了以下几种检索对象的方式 导航对象图:根据已经加载的对象导航到其它对象 OID:按照对象的OID来检索对象 HQL:使用面向对象的HQL查询语句 QBC:使用QBC(Q ...

最新文章

  1. eclipse序列化生成serialVersionUID
  2. sql 2005判断某个表或某个表中的列是否存在
  3. MySQL的ODBC安装错误问题!
  4. JQuery DataTables改变行或列的背景或字体颜色
  5. python中groupby()函数讲解与示例_详解python中groupby函数通俗易懂
  6. 16节课搞懂大数据,视频教程限时免费领取
  7. 泛型 (Generics)一定是最易懂简单的
  8. 59. 预定义超全局变量
  9. PHP项目汇报ppt模板,免费工作汇报模板(课堂PPT)
  10. win7 系统激活工具 亲测可行
  11. 数据库报duplicate XXX entry for key primary错误的可能原因以及解决方法
  12. 最长单词 c++实现
  13. fastboot 刷机前面遇到的坑
  14. BIOS设置与硬盘分区
  15. ai若无声,我宁沉默夜寂无声,伊人浅唱。
  16. 二进制位两数相加,加数补码的合理取值范围
  17. oracle bulk collect into,BULK COLLECT INTO
  18. status 401 reading SysUserService#login(Stri
  19. Win11怎么查看计算机历史记录?
  20. 思科学院cisco-基本网络连接和通信

热门文章

  1. vue init webpack vue-demo01复杂安装的详解
  2. 我与Linux系统的交集
  3. hibernate(nested transactions not supported)异常
  4. application/json 四种常见的 POST 提交数据方式
  5. TypeScript Generics(泛型)
  6. C# 遍历List 并删除某个元素
  7. oracle索引建立
  8. 【英语天天读】I want I do I get
  9. Ajax乱码解决方案
  10. CCIR601和CCIR656标准的区别