1. 從一方關(guān)聯(lián)多的一方: 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 決定發(fā)送的SQL語(yǔ)句的類型
lazy 控制關(guān)聯(lián)對(duì)象的檢索是否采用延遲.,就即決定多的一方Orders
是否延遲加載(注意: class 上的 lazy 屬性決定一方Customer
是否支持延遲加載)
fetch:
- select (默認(rèn)取值), 會(huì)發(fā)送多條SQL查詢關(guān)聯(lián)對(duì)象.
- join : 發(fā)送迫切左外連接的SQL查詢關(guān)聯(lián)對(duì)象. fetch=”join” 那么lazy被忽略了.
- subselect :發(fā)送子查詢查詢關(guān)聯(lián)對(duì)象.(需要使用Query接口測(cè)試)
lazy:
- true :默認(rèn)值, 查詢關(guān)聯(lián)對(duì)象的時(shí)候使用延遲檢索
- false :查詢關(guān)聯(lián)對(duì)象的時(shí)候不使用延遲檢索.
- extra :極其懶惰.(例如查詢數(shù)量康震,只發(fā)送 count 語(yǔ)句)
搭配結(jié)果:
fetch= select
-
lazy=true
驱富,當(dāng)使用到Order對(duì)象時(shí)买雾,才會(huì)發(fā)送查詢Order的語(yǔ)句 -
lazy=false
, 當(dāng)查詢Customer對(duì)象時(shí)掷酗,就會(huì)發(fā)送查詢 Order 的語(yǔ)句 -
lazy=extra
, 當(dāng)查詢 Order 對(duì)象時(shí)虽界,才會(huì)發(fā)送查詢Order的語(yǔ)句扛施,當(dāng)只查詢數(shù)量時(shí)鸿捧,只發(fā)送count 語(yǔ)句
-
fetch=join
, lazy 取值被忽略
- 發(fā)送迫切左外連接查詢
fetch=subselect
- 查詢 Order 對(duì)象時(shí),發(fā)送子查詢語(yǔ)句
2. 從多方關(guān)聯(lián)到一方 (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 標(biāo)簽中屬性: fetch疙渣、lazy
fetch:控制SQL語(yǔ)句發(fā)送格式
- join :發(fā)送一個(gè)迫切左外連接查詢關(guān)聯(lián)對(duì)象.fetch=”join”,lay屬性會(huì)被忽略.
- select :發(fā)送多條SQL檢索關(guān)聯(lián)對(duì)象.
lazy:關(guān)聯(lián)對(duì)象檢索的時(shí)候,是否采用延遲
- false :不延遲
- proxy :使用代理.檢索訂單額時(shí)候,是否馬上檢索客戶 由Customer對(duì)象的映射文件中<class>上lazy屬性來(lái)決定.
- no-proxy :不使用代理
3. 批量抓取
一方關(guān)聯(lián)多方: Customer->Orders
Customer.hbm.xml
<class name="Person">
<set name="cats" batch-size="3">
...
</set>
</class>
如果Customer 中有 10 個(gè)訂單匙奴, batch-size 是 3,那么 Hibernate 將會(huì)分四次執(zhí)行 SELECT 查詢Order妄荔, 按照 3泼菌、3、3啦租、1
的大小分別載入數(shù)據(jù)灶轰。這里的每次載入的數(shù)據(jù)量還具體依賴于當(dāng)前 Session 中未實(shí)例化集合的個(gè)數(shù)。
多方關(guān)聯(lián)一方: Order->Customer
需求: 查詢每個(gè)訂單對(duì)應(yīng)的 Customer 的名稱集合
默認(rèn): 查詢所有訂單刷钢,發(fā)送一個(gè)SQL笋颤; 然后對(duì)應(yīng)每個(gè)訂單查詢Customer,發(fā)送一個(gè)SQL
select
customer0_.id as id1_1_0_,
customer0_.name as name2_1_0_
from
customer customer0_
where
customer0_.id=?
在Customer.hbm.xml的 class 標(biāo)簽上添加屬性: 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 (
?, ?, ?
)