Hibernate系列之(1) 抓取策略

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

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

    <class name="com.example.domain.Customer" table="customer" select-before-update="true"  lazy="true">
        <id name="cid" column="id" >
            <generator class="native" />
        </id>
        <property name="cname" column="name" />
        <set name="orders" cascade="save-update" fetch="join" lazy="true">
            <key column="cno"></key>
            <one-to-many class="com.example.domain.Order"></one-to-many>
        </set>
    </class>

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 文件中配置:

    <class name="com.example.domain.Order" table="orders" select-before-update="true" lazy="true">
        <id name="oid" column="id" >
            <generator class="native" />
        </id>
        <property name="addr" column="address" />
        <many-to-one name="customer" column="cno" class="com.example.domain.Customer" cascade="save-update" />
    </class>

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

fetch:控制SQL语句发送格式

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

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

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

3. 批量抓取

一方关联多方: Customer->Orders

Customer.hbm.xml

<class name="Person">
<set name="cats" batch-size="3">
...
</set>
</class>

如果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 (
            ?, ?, ?
        )
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值