抓取策略(fetching strategies)是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候,Hibernate如何获取关联对象的策略。抓取策略可以在O/R映射的元数据中声明,也可以在特定的HQL或条件查询(CriteriaQuery)中重载声明。

  在这里我们还是创建categroy与book的关联关系。

  在Hibernate中定义了如下几种抓取策略:

    ①.连接抓取(Join fatching)- Hibernate通过在select语句中使用outer join(外连接)来获得对象的关联实例或者关联集合。

      在关系关联的配置中中有一个属性fetch,默认为select,这里我们将它设置为join,然后我们去查询数据发现,这里的延迟加载并没有起作用,而是在查询book时直接使用外连接将categroy一起查询出来。

    ②.查询抓取(select fetching)- 另外发送一条select语句抓取当前对象的关联实体或集合。除非你显示的指定lazy=false禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。

      在关系关联的配置中中有一个属性fetch,默认为select,它在这里做了什么操作呢?我们在查询book的信息时,我们想要获取categroy的信息时发出一条select语句去查询categroy的信息。至于在什么时候去查询categroy的信息在于前面设置的lazy的值,如果设置为false则在查询book的信息时会一并查询categroy的值,如果不为false时则是在使用categroy时再去查询。

    ③.子查询抓取(Sunbselect fetching)- 另外发送一条select语句抓取在前面查询到(或者抓取到)的所有实体对象的关联集合。除非你显示的指定lazy=false禁止延迟抓取(lazy fetching),否则只有当你真正访问关联关系的时候,才会执行第二条select语句。

      在这我们去查询所有的categroy,并且查询categroy下的所有书籍。这里有使用的上衣篇所学过的iterate迭代n+1。在查询过程中我们发现,Hibernate首先将所有的categroy查询出来,然后再去查询每一个categroy下的book,这样的话就感觉查询book有点重复,有点多余。于是我们在这里就要使用子查询抓取(Subselect fetching),而且 Subselect fetching受到lazy的影响,如果将lazy设置为false,则在查询categroy时就会将含有categroy信息的book全部查询出来,如果将lazy设置为非false,则会再使用book信息时再去查询。

      将fetch修改为subselect后查询发现只出现2条sql语句,其中一条是查询categroy的信息,而剩下一条则是查询的book信息,其中使用了in语句,将所有包含categroy的book都查询了出来。

      并且这里还可以使用in将categroy进行过滤,而且在下面查询book时也会直接将这些categroy的book查询出来。

      电脑屏幕小,不能直接截图,只能将sql直接复制下来。

 select
  books0_.category_id as category2_1_1_,
  books0_.book_id as book_id1_0_1_,
  books0_.book_id as book_id1_0_0_,
  books0_.category_id as category2_0_0_,
  books0_.author as author3_0_0_,
  books0_.book_name as book_nam4_0_0_,
  books0_.price as price5_0_0_,
  books0_.pub_date as pub_date6_0_0_
from
  Book books0_
where
  books0_.category_id in (
    select
      this_.id
    from
      Category this_
    where
      this_.id in (
        ?, ?, ?
      )
  )

    

    ④.批量抓取(Batch fetching)- 对查询抓取的优化方案,通过指定一个主键或者外键列表,Hibernate使用单条select语句获取一批对象实例或集合。

      在进行大数据量操作时会速度缓慢,所以这里使用了Batch fetching来进行操作。我们在这里将set中batch-size设置为2,意思是将2条sql合在一起查询,因为这里有延迟加载,在使用到book时才会查询,而且是使用一次查询一次,但是在这里将batch-size设置为2,就会在使用到book时一次查询出2个book的信息,查到第3条book信息时再去查询。这样在一定程度上加快了查询效率。

注:本文是在学习期间根据网上视频写的学习笔记,如有侵权请联系删除!

Hibernate fetching strategies(抓取策略)的更多相关文章

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

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

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

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

  3. Hibernate(十四)抓取策略

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

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

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

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

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

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

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

  7. hibernate抓取策略

    抓取策略(fetching strategy) 是指:当应用程序需要在(Hibernate实体对象图的)关联关系间进行导航的时候, Hibernate如何获取关联对象的策略.抓取策略可以在O/R映射的 ...

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

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

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

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

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

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

随机推荐

  1. protoc

    平台安装: 在window 平台使用的工具protoc.zip linux平台的安装方式. 执行在windos平台上执行生成java代码命令: protoc --java_out=./ Keyword ...

  2. 你知道吗?31种 CSS 选择器的应用

    选择器(selector)是CSS中很重要的概念,所有HTML语言中的标记都是通过不同的CSS选择器进行控制的.用户只需要通过选择器对不同的HTML标签进行控制,并赋予各种样式声明,即可实现各种效果. ...

  3. python mysql参数化查询防sql注入

    一.写法 cursor.execute('insert into user (name,password) value (?,?)',(name,password)) 或者 cursor.execut ...

  4. 爬虫--PySpider框架

    PySpider框架 PySpider框架的作用

  5. mac终端配色

    1. 终端输入 ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)" 2. brew installxz ...

  6. perl6 单线程破解phpmyadmin脚本

    use HTTP::UserAgent; my $ua = HTTP::UserAgent.new; my $url = 'http://localhost/phpMyAdmin/index.php' ...

  7. 摘: 给Shapre命名

    有两种解决方式: 在 VBA 中将slide中的Shape命名,改变shape.name即可. 另外一种方式就是有点投机取巧:你可以点击shap,右键选择web/alternativetext做些标记 ...

  8. 在Perl中使用Getopt::Long模块来接收用户命令行参数

    我们在linux常常用到一个程序需要加入参数,现在了解一下perl中的有关控制参数的函数.getopt.在linux有的参数有二种形式.一种是–help,另一种是-h.也就是-和–的分别.–表示完整参 ...

  9. mysql的一些规范

    我司的mysql规范,值得牢记 一.禁止内容 表字段类型 不推荐使用enum,set,blob,text等类型 表中所有字段都不能为空,需要设置not null属性,可以给默认值 表的主键列值禁止被更 ...

  10. 一致性hash理解

    在做memcached分布式集群时往往要用到一致性hash算法来调节缓存数据的分布. 通常的hash算法是以服务器数量N作为模数,使用key%N的值来获得最终位置,显然当服务器数量发生变化即N发生变化 ...