新聞中心
Hibernate數(shù)據(jù)加載支持以下幾種方式:

◆即時(shí)加載(Immediate Loading)
◆當(dāng)實(shí)體加載完成后,立即加載其關(guān)聯(lián)數(shù)據(jù)
◆延遲加載(Lazy Loading)
◆實(shí)體加載時(shí),其關(guān)聯(lián)數(shù)據(jù)并非馬上獲取,而是當(dāng)關(guān)聯(lián)數(shù)據(jù)第一次被訪問(wèn)時(shí)再進(jìn)行讀取.
◆預(yù)先加載(Eager Loading),預(yù)先加載時(shí),實(shí)體及其關(guān)聯(lián)對(duì)象同時(shí)讀取,這與即時(shí)加載類(lèi)似,不過(guò)實(shí)體及其關(guān)聯(lián)數(shù)據(jù)是通過(guò)一條SQL語(yǔ)句(基于外連接[outer join])同時(shí)讀取.
◆批量加載(Batch Loading),對(duì)于即時(shí)加載與延遲加載,可以采用批量加載方式進(jìn)行性能上的優(yōu)化
即時(shí)加載(Immediate Loading)
配置如下:
- "address"
- table="t_address"
- inverse="true"
- cascade="none"
- sort="unsorted"
- lazy="false">
- "user_id">
- class="com.hpjianhua.hibernate.Address"/>
即時(shí)Hibernate數(shù)據(jù)加載的基本原理:當(dāng)宿主實(shí)體(關(guān)聯(lián)主體)加載時(shí),Hibernate會(huì)馬上自動(dòng)讀取其關(guān)聯(lián)的數(shù)據(jù)并完成關(guān)聯(lián)屬性的填充.
延遲加載(Lazy Loading)
配置如下:
- "address"
- table="t_address"
- inverse="true"
- cascade="none"
- sort="unsorted"
- lazy="true">
- "user_id">
- class="com.hpjianhua.hibernate.Address"/>
預(yù)先加載(Eager Loading)
預(yù)先Hibernate數(shù)據(jù)加載即通過(guò)outer-join完成關(guān)聯(lián)數(shù)據(jù)的加載,這樣,通過(guò)一條SQL語(yǔ)句即可完成實(shí)體及其關(guān)聯(lián)數(shù)據(jù)的讀取操作,相對(duì)即時(shí)讀取的兩條甚至若干條SQL而言,無(wú)疑這種機(jī)制在性能上能帶來(lái)更多的提升.
批量加載(Batch Loading)
批量加載,簡(jiǎn)而言之,就是通過(guò)批量Hibernate數(shù)據(jù)加載提交多個(gè) 限定條件,一次完成多個(gè)數(shù)據(jù)的讀取.如對(duì)于以下形式的SQL:
Select from User where id=1;
Select from User where id=3;
我們可以整合成一條SQL語(yǔ)句完成同樣的功能:
Select from User where id=1 or id=3;
這就是所謂的批量Hibernate數(shù)據(jù)加載機(jī)制,如果使用了批量加載機(jī)制,Hibernate在進(jìn)行數(shù)據(jù)查詢操作前,會(huì)自動(dòng)在當(dāng)前的Session中尋找是否還有其他同類(lèi)型的待加載的數(shù)據(jù),如果有,則將其查詢條件合并到當(dāng)前的select語(yǔ)句中一并提交,這樣,通過(guò)一次數(shù)據(jù)庫(kù)操作即完成了多個(gè)讀取任務(wù).
在實(shí)體配置的class節(jié)點(diǎn)中,我們可以通過(guò)batch-size參數(shù)打開(kāi)批量加載機(jī)制,并限定每次批量加載的數(shù)量:
一般來(lái)說(shuō),batch-size應(yīng)該設(shè)定為一個(gè)合理的小型數(shù)值(<10).
文章名稱(chēng):Hibernate數(shù)據(jù)加載方式淺析
分享URL:http://www.5511xx.com/article/djgijde.html


咨詢
建站咨詢
