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 语句)
搭配结果:
fetch= select
-
lazy=true
,当使用到Order对象时,才会发送查询Order的语句 -
lazy=false
, 当查询Customer对象时,就会发送查询 Order 的语句 -
lazy=extra
, 当查询 Order 对象时,才会发送查询Order的语句,当只查询数量时,只发送count 语句
-
fetch=join
, lazy 取值被忽略
- 发送迫切左外连接查询
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 (
?, ?, ?
)