Hibernate系列之(1) 抓取策略

1. 从一方关联多的一方: Customer-> Orders

在 Customer.hbm.xml 配置文件中:

    
        
            
        
        
        
            
            
        
    

set 集合上的属性: fetch、 lazy

fetch 决定发送的SQL语句的类型
lazy 控制关联对象的检索是否采用延迟.,就即决定多的一方Orders是否延迟加载(注意: class 上的 lazy 属性决定一方Customer是否支持延迟加载)

fetch:

  • select (默认取值), 会发送多条SQL查询关联对象.
  • join : 发送迫切左外连接的SQL查询关联对象. fetch=”join” 那么lazy被忽略了.
  • subselect :发送子查询查询关联对象.(需要使用Query接口测试)

lazy:

  • true :默认值, 查询关联对象的时候使用延迟检索
  • false :查询关联对象的时候不使用延迟检索.
  • extra :极其懒惰.(例如查询数量,只发送 count 语句)

搭配结果:

  1. fetch= select
  • lazy=true ,当使用到Order对象时,才会发送查询Order的语句
  • lazy=false , 当查询Customer对象时,就会发送查询 Order 的语句
  • lazy=extra, 当查询 Order 对象时,才会发送查询Order的语句,当只查询数量时,只发送count 语句
  1. fetch=join, lazy 取值被忽略
  • 发送迫切左外连接查询
  1. fetch=subselect
  • 查询 Order 对象时,发送子查询语句

2. 从多方关联到一方 (Orders->Customer)

在 Order.hbm.xml 文件中配置:

    
        
            
        
        
        
    

many-to-one 标签中属性: fetch、lazy

fetch:控制SQL语句发送格式

  • join :发送一个迫切左外连接查询关联对象.fetch=”join”,lay属性会被忽略.
  • select :发送多条SQL检索关联对象.

lazy:关联对象检索的时候,是否采用延迟

  • false :不延迟
  • proxy :使用代理.检索订单额时候,是否马上检索客户 由Customer对象的映射文件中上lazy属性来决定.
  • no-proxy :不使用代理

3. 批量抓取

一方关联多方: Customer->Orders

Customer.hbm.xml



...


如果Customer 中有 10 个订单, batch-size 是 3,那么 Hibernate 将会分四次执行 SELECT 查询Order, 按照 3、3、3、1
的大小分别载入数据。这里的每次载入的数据量还具体依赖于当前 Session 中未实例化集合的个数。

多方关联一方: Order->Customer

需求: 查询每个订单对应的 Customer 的名称集合
默认: 查询所有订单,发送一个SQL; 然后对应每个订单查询Customer,发送一个SQL

    select
        customer0_.id as id1_1_0_,
        customer0_.name as name2_1_0_ 
    from
        customer customer0_ 
    where
        customer0_.id=?

Customer.hbm.xml的 class 标签上添加属性: batch-size=3
注意是 Customer.hbm.xml不是 Order.hbm.xml

select
        customer0_.id as id1_1_0_,
        customer0_.name as name2_1_0_ 
    from
        customer customer0_ 
    where
        customer0_.id in (
            ?, ?, ?
        )

你可能感兴趣的:(Hibernate系列之(1) 抓取策略)