Hibernate系列之(1) 抓取策略

2017-08-16  本文已影响11人  Ethan_Walker

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:

lazy:

搭配结果:

  1. fetch= select
  1. fetch=join, lazy 取值被忽略
  1. fetch=subselect

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语句发送格式

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

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 (
            ?, ?, ?
        )
上一篇 下一篇

猜你喜欢

热点阅读