• Hibernate fetching strategies(抓取策略)


      抓取策略(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直接复制下来。

     1 select
     2   books0_.category_id as category2_1_1_,
     3   books0_.book_id as book_id1_0_1_,
     4   books0_.book_id as book_id1_0_0_,
     5   books0_.category_id as category2_0_0_,
     6   books0_.author as author3_0_0_,
     7   books0_.book_name as book_nam4_0_0_,
     8   books0_.price as price5_0_0_,
     9   books0_.pub_date as pub_date6_0_0_ 
    10 from
    11   Book books0_ 
    12 where
    13   books0_.category_id in (
    14     select
    15       this_.id 
    16     from
    17       Category this_ 
    18     where
    19       this_.id in (
    20         ?, ?, ?
    21       )
    22   )

        

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

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

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

  • 相关阅读:
    poj 1328 Radar Installation (贪心)
    hdu 2037 今年暑假不AC (贪心)
    poj 2965 The Pilots Brothers' refrigerator (dfs)
    poj 1753 Flip Game (dfs)
    hdu 2838 Cow Sorting (树状数组)
    hdu 1058 Humble Numbers (DP)
    hdu 1069 Monkey and Banana (DP)
    hdu 1087 Super Jumping! Jumping! Jumping! (DP)
    必须知道的.NET FrameWork
    使用记事本+CSC编译程序
  • 原文地址:https://www.cnblogs.com/wuyx/p/8483003.html
Copyright © 2020-2023  润新知