抓取策略(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. mongoDB与sql聚合操作对应图

    SQL Terms, Functions, and Concepts MongoDB Aggregation Operators WHERE $match GROUP BY $group HAVING ...

  2. 更改gradle的java的class文件输出目录的结构

    group 'com.thinkvenus.common'version '1.0-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 r ...

  3. 使用Forms Authentication

    using System; using System.Web; using System.Web.Security;   namespace AuthTest {   public class Aut ...

  4. POJ 3734 Blocks (矩阵快速幂)

    题目链接 Description Panda has received an assignment of painting a line of blocks. Since Panda is such ...

  5. 项目开发 -- ZFS容量分配

    存储池 allocated 池中已实际分配的存储空间量.该属性也可通过其简短列名alloc来引用. capacity 已用的池空间百分比.此属性也可通过其简短列名cap来引用. dedupratio ...

  6. weblogic nmap扫描脚本

     CVE-2018-2894 / Nmap利用脚本,可批量批量快速扫描getshell.检测漏洞.利用漏洞 地址:https://github.com/Rvn0xsy/nse_vuln/tree/ma ...

  7. HttpURLConnection传json

    private static String sendToWangTing(DataRow dataRow) throws IOException{ String ip = Configuration. ...

  8. How to insert a segment of noise to music file

    如何向音频文件中插入噪声 为了研究噪声和音乐对EEG的的影响,实验前需要准备一段夹杂噪声的音乐. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ...

  9. 在Ubuntu上使用pip安装错误 read timed out 处理方法

    在终端输入 pip --default-timeout=1000 install -U pip 也就是修改超时时间.

  10. CentOS7安装Hadoop2.7完整步骤

    总体思路,准备主从服务器,配置主服务器可以无密码SSH登录从服务器,解压安装JDK,解压安装Hadoop,配置hdfs.mapreduce等主从关系. 1.环境,3台CentOS7,64位,Hadoo ...