Hibernate學(xué)習(xí)筆記之Lazy策略
Hibernate Lazy采用CGLIB,可以對(duì)類(lèi)進(jìn)行代理,用在:
Class: 可以取值true,false,默認(rèn)true
Property: 可以取值true,false,需要類(lèi)增強(qiáng)工具
集合:true/false/extra
one-to-one,many-to-one:取false,proxy/noproxy
Hibernate lazy概念:只有真正使用該對(duì)象時(shí),才會(huì)創(chuàng)建,對(duì)于Hibernate來(lái)說(shuō),只有真正使用時(shí)才會(huì)發(fā)出sql。
測(cè)試類(lèi)Hibernate Lazy:查id不發(fā)sql,因?yàn)槟銈鞯木褪侵麈I,查別的屬性會(huì)發(fā)sql,Hibernate Lazy有效期必須是session在open時(shí)才可以,解決方式是使用openSessionInview。
測(cè)試集合Hibernate Lazy:get集合時(shí)不會(huì)發(fā)sql,迭代會(huì)發(fā)sql,查個(gè)數(shù)的時(shí)候會(huì)把整個(gè)集合查出來(lái),這樣的話對(duì)效率有影響。
把class的lazy設(shè)置成false時(shí),再load類(lèi)時(shí)會(huì)把普通屬性都查出來(lái),但是集合不查。
class標(biāo)簽上的lazy不會(huì)影響到集合上的lazy特性。
class標(biāo)簽上的lazy特性只對(duì)普通屬性起作用。
lazy在集合上用extra在獲取size的時(shí)候會(huì)發(fā)出count語(yǔ)句,這樣對(duì)效率有提升。
在單端關(guān)聯(lián)上lazy默認(rèn),和集合一樣,在get時(shí)返回代理不發(fā)查詢(xún)語(yǔ)句,在使用時(shí)發(fā)出sql。
在單端關(guān)聯(lián)上lazy=false,在訪問(wèn)普通屬性時(shí)發(fā)出兩條sql,查詢(xún)屬性以及對(duì)應(yīng)的關(guān)聯(lián)對(duì)象。
將class標(biāo)簽上lazy設(shè)置成false,其它默認(rèn):不會(huì)影響單端關(guān)聯(lián),也不會(huì)影響集合。
【編輯推薦】