Hibernate fetching strategies(抓取策略)

时间:2022-03-24 07:35:59

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

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

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

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

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

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

 

 

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

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

Hibernate fetching strategies(抓取策略)

 

    ③.子查询抓取(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信息时再去查询。

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

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

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

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

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

 

      电脑屏幕小,不能直接截图,只能将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信息时再去查询。这样在一定程度上加快了查询效率。

Hibernate fetching strategies(抓取策略)

Hibernate fetching strategies(抓取策略)

 

 

 

 

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