Hibernate
提供了
3
種檢索策略:
l???????
延遲檢索;
l???????
立即檢索;
l???????
迫切左外連接;
Hibernate
提供
2
種方式來(lái)確定檢索策略,一中是在配置文件當(dāng)中,另外一種是在程序種設(shè)置。當(dāng)然,如果你在程序中設(shè)置了檢索策略,那么你在配置文件中的設(shè)置也就無(wú)效了。另外的一種情況是
HQL
會(huì)忽略配置文件的設(shè)置,而總是采用迫切左外連接。
一、
類級(jí)別的檢索
可以選擇的檢索策略是立即檢索和延遲檢索,默認(rèn)的是立即檢索。用配置文件中的
<class>
節(jié)點(diǎn)的
lazy
來(lái)控制。
注意:不管你在配置
class
的
lazy
是
true
還是
false
,對(duì)
get()
和
create
Criteria
()
方法都不起作用,只有對(duì)
load()
方法起作用。
當(dāng)你使用的檢索策略是
lazy
的時(shí)候,當(dāng)你執(zhí)行
Customer customer = (Customer)session.load(Customer.class,new Long(1));
的時(shí)候,
Hibernate
不從數(shù)據(jù)庫(kù)檢索數(shù)據(jù),而只是產(chǎn)生一個(gè)代理類,只有當(dāng)你執(zhí)行
Customer.getName();
的時(shí)候, Hibernate 才到數(shù)據(jù)庫(kù)取數(shù)據(jù)。所以,如下的代碼是會(huì)被拋出異常的:



? Customer?customer? = ?(Customer)session.load(Customer. class , new ?Long( 1 ));

? session.close();


get()
方法總是用的立即檢索,如果和它相關(guān)聯(lián)的類也是用的立即檢索,那么也會(huì)把相關(guān)聯(lián)的數(shù)據(jù)也檢索出來(lái)。
二、
一對(duì)和多對(duì)多關(guān)聯(lián)檢索
一般地,為了有減少對(duì)數(shù)據(jù)庫(kù)的訪問(wèn),我們往往用延遲檢索的策略。所以,我們優(yōu)先使用如下方式;
<set class=”order” inverse=”true’ lazy=”true” >
但是,我們?cè)跈z索“多”的一方的時(shí)候,
Hibernate
不能為我們產(chǎn)生代理類。由此,我們就要用
betch-size
的配置來(lái)減少
SQL
語(yǔ)句。
當(dāng)我們使用
outer-join
屬性的時(shí)候,我們就沒(méi)有必要使用
lazy
屬性了。
Outer-join
會(huì)一次將“一”方和與之相關(guān)的“多”方用左外連接的方式檢索出來(lái)。
Session session = sessionFactory.openSession();
?????????????
?????? Transaction tx = null;
?????????????
????? ?tx = session.beginTransaction();
?????????????
????? Customer customer = (Customer)session.get(Customer.class,new Long(1));
產(chǎn)生的
SQL
語(yǔ)句如下:
Hibernate: select customer0_.ID as ID1_, customer0_.NAME as NAME2_1_, orders1_.CUSTOMER_ID as CUSTOMER3_3_, orders1_.ID as ID3_, orders1_.ID as ID0_, orders1_.ORDER_NUMBER as ORDER2_1_0_, orders1_.CUSTOMER_ID as CUSTOMER3_1_0_ from sampledb.customers customer0_ left outer join sampledb.orders orders1_ on customer0_.ID=orders1_.CUSTOMER_ID where customer0_.ID=?