一、查询方法中get方法采用策略是立即检索,而load方法采用策略是延迟检索,延迟检索是在使用数据时才发送SQL语句加载数据

获取延迟加载数据方式:1、使用的时候,如果Customer c=session.load(Customer.class,1);//加载id为1的客户,此时是延迟加载,返回的是代理对象,当使用的时候加载数据,如c.getName();

           2、调用Hibernate.initialize(c);方法,初始化对象,也可加载到数据

二、类级别检索策略

包括立即检索和延迟检索,即使用get和load方法,而Query查询的数据属于类级别检索中的立即检索

可以在hbm.xml文件中的class节点配置lazy="false",这样load方法也变成立即检索了,和get方法一样了

三、关联级别检索策略

1、多对多与一对多,都是先得到一个再检索另一个,所以这两种情况一样

在hbm.xml文件中set节点上设置fetch和lazy两个属性

fetch可取值:join select subselect  fetch代表检索时语句方式

lazy可取值:true false extra   lazy代表是否延迟

(1)、如果fetch为join,则lazy失效,采用迫切左外连接

(2)、fetch为select时,将生成多条简单SQL语句

    lazy=false,立即检索

    lazy=true,延迟检索

    lazy=extra,加强延迟检索(极其懒惰检索),比如查询关联类集合条数,则发送select count(*) from table

(3)、fetch为subselect时,将生成子查询SQL语句,这时查询方法要用query.list().get

使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

2、一对一和多对一情形一样,都是由一个得到另一个

在hbm.xml文件中many-to-one节点上设置fetch和lazy两个属性

fetch可取:join select

lazy可取:false proxy no-proxy

(1)、如果fetch为join,则lazy失效,采用迫切左外连接

(2)、fetch为select时,将生成多条简单SQL语句

    lazy=false,立即检索

    lazy=proxy,采用的检索方式为对方类级别检索方式,如订单查询客户是一对多,此时要采用customer.hbm.xml配置中class上配置的lazy检索方式

使用Query查询数据时,自己编写hql语句,则fetch=join无效,关联集合将根据lazy设置进行加载

结论:开发中能延迟则延迟,必须立即才立即(优化方案)

四、批量检索,解决N+1查询问题

N+1问题:如查询所有客户订单,首先查询出所有客户,而后根据每个客户id分别去查找订单,导致N+1问题

其实质就是先查询所有客户,得到客户id,然后通过SQL的in语句来查询订单中客户id in(前门查出的id)中

解决方案:在customer.hbm.xml文件中set节点设置batch-size属性,即,分批提取数据。如果共4个客户,设置值大于等于4会有两条SQL语句发出;如果设置小于4,则至少会有三条语句发出

如果是通过订单查询客户解决N+1问题,而订单中没有set节点,就在客户hbm.xml配置文件的class节点配置batch-size(是查询客户,所以在客户class节点配置)

Hibernate检索策略(抓取策略)(Hibernate检索优化)的更多相关文章

  1. Hibernate(十四)抓取策略

    抓取策略: 抓取策略是当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略.Hibernate的抓取策略是Hibernate提升性能的一 ...

  2. hibernate 延迟加载和抓取策略

    一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...

  3. Hibernate学习---第十一节:Hibernate之数据抓取策略&批量抓取

    1.hibernate 也可以通过标准的 SQL 进行查询 (1).将SQL查询写在 java 代码中 /** * 查询所有 */ @Test public void testQuery(){ // ...

  4. 【转】hibernate延迟加载和抓取策略

    一.延迟加载 1.简单查询get,load 针对对象本身延迟或即时 当使用load方法来得到一个对象时,此时hibernate会使用延迟加载的机制来加载这个对象,即:当我们使用session.load ...

  5. 【Hibernate学习】 —— 抓取策略(注解方式)

    当应用程序须要在关联关系间进行导航的时候.hibernate怎样获取关联对象的策略. 抓取策略的方式: FetchType.LAZY:懒载入.载入一个实体时.定义懒载入的属性不会立即从数据库中载入. ...

  6. hibernate检索策略(抓取策略)

    检索策略 类级别检索 默认检索策略:默认延迟加载, 可以使用lazy属性来进行改变. session.get(clazz,object)默认立即加载 @Test //测试左外连接查询 public v ...

  7. Hibernate查询方式&抓取策略

    Hibernate的查询方式 1.OID查询 hibernate根据对象的OID(主键)进行检索 使用get方法 Customer customer=session.get(Customer.clas ...

  8. 【Hibernate 8】Hibernate的调优方法:抓取策略

    在上一篇博客中,介绍了Hibernate的缓存机制.合理的配置缓存,可以极大程度上优化Hibernate的性能.这篇博客,介绍另外一个调优方式:抓取策略. 一.什么是抓取策略 抓取策略(fetchin ...

  9. Hibernate中的多表查询及抓取策略

    1.Hibernate中的多表查询 1.1SQL中的多表查询 [交叉连接] select * from A,B; [内连接] 显示内连接:inner join(inner 可以省略) Select * ...

  10. Hibernate的抓取策略(优化)

    延迟加载的概述 什么是延迟加载 延迟加载:lazy(懒加载).执行到该行代码的时候,不会发送语句去进行查询,在真正使用这个对象的属性的时候才会发送SQL语句进行查询. 延迟加载的分类 l  类级别的延 ...

随机推荐

  1. 【C#】ContextMenuStrip 右键菜单颜色设置

    有些时候自己想要修改ContexMenuStrip右键菜单的一些背景色之类的,该如何实现呢? 首先: ContextMenuStrip _context = new ContextMenuStrip( ...

  2. TeeChart控件的安装与常用 功能设置

    TeeChart控件的安装 TeeChart 7.0 With Source在Delphi 7.0中的安装 一.删除Delphi7自带TeeChart  1.Component -> insta ...

  3. C语言 文件操作1--二进制文件与文本文件

    //写文件两种方式(文本文件和二进制文件) #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h&g ...

  4. INADDR_ANY的确切含义

    INADDR_ANY就是inet_addr("0.0.0.0") 首先,需要明确的是当服务器的监听地址是INADDR_ANY时设置的是服务器的IP地址. 其次,当服务器的监听地址是 ...

  5. 深入了解view以及自定义控件

    参考文章: http://blog.csdn.net/guolin_blog/article/details/12921889 Android LayoutInflater原理分析,带你一步步深入了解 ...

  6. Django基础 - Debug设置为False后静态文件获取404

    当设置setting.py文件当中的DEBUG=FALSE后,Django会默认使用Web Server的静态文件处理,故若没设置好Web Server对静态文件的处理的话,会出现访问静态文件404的 ...

  7. 基于IHttpAsyncHandler的TCP收发器

    上一篇文章中,我们提到使用IHttpAsyncHandler来进行UDP的收发操作.由于UDP模型比较简单,所以运行没什么问题.这一篇我主要是使用IHttpAsyncHandler来进行TCP的收发操 ...

  8. windows live writer 尝试登陆时发生意外错误,导致无法发表博客解决方案

    刚用windows live writer发表博客, 但是出现如下提示: 尝试登陆时发生意外错误: 网络连接错误--尝试连接到一下日志时出错: http://www.cnblogs.com//xxxx ...

  9. Logparser 的用法

    Logparser是一款非常强大的日志分析软件,可以帮助你详细的分析网站日志.是所有数据分析和网站优化人员都应该会的一个软件.Logparser是微软的一款软件完全免费的,大家可以在微软的官网上去下载 ...

  10. 分布式人工智能标记语言(DAIML)示例

          DAIML(Distributed Artificial Intelligence Markup Language)是用于分布式人工智能系统中智能语言的标记库.DAIML主要分为Patte ...