日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
淺析Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載

學(xué)習(xí)Hibernate時,經(jīng)常會遇到實(shí)體對象延遲加載問題,這里將介紹問題的解決方法Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載。

成都創(chuàng)新互聯(lián)公司主營儀征網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,app軟件開發(fā)公司,儀征h5成都微信小程序搭建,儀征網(wǎng)站營銷推廣歡迎儀征等地區(qū)企業(yè)咨詢

延遲加載機(jī)制是為了避免一些無謂的性能開銷而提出來的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時候,才真正執(zhí)行數(shù)據(jù)加載操作。在Hibernate中提供了對實(shí)體對象的延遲加載以及對集合的延遲加載,另外在Hibernate3中還提供了對屬性的延遲加載。下面我們就分別介紹這些種類的延遲加載的細(xì)節(jié)。

Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載:

如果想Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載,必須要在實(shí)體的映射配置文件中進(jìn)行相應(yīng)的配置,如下所示:

 
 
 
  1.  
  2.  name=”com.neusoft.entity.User” table=”user” lazy=”true”> 
  3. ……  
  4.  
  5.  

通過將class的lazy屬性設(shè)置為true,來開啟實(shí)體的延遲加載特性。如果我們運(yùn)行下面的代碼:

 
 
 
  1. User user=(User)session.load(User.class,”1”);  
  2. System.out.println(user.getName()); 

當(dāng)運(yùn)行到第一條時,Hibernate并沒有發(fā)起對數(shù)據(jù)的查詢,如果我們此時通過一些調(diào)試工具(比如JBuilder2005的Debug工具),觀察此時user對象的內(nèi)存快照,我們會驚奇的發(fā)現(xiàn),此時返回的可能是 User$EnhancerByCGLIB$$bede8986類型的對象,而且其屬性為null,這是怎么回事?還記得前面我曾講過session.load()方法,會返回實(shí)體對象的代理類對象,這里所返回的對象類型就是User對象的代理類對象。在Hibernate中通過使用CGLIB,來實(shí)現(xiàn)動態(tài)構(gòu)造一個目標(biāo)對象的代理類對象,并且在代理類對象中包含目標(biāo)對象的所有屬性和方法,而且所有屬性均被賦值為null。通過調(diào)試器顯示的內(nèi)存快照,我們可以看出此時真正的User對象,是包含在代理對象的CGLIB$CALBACK_0.target屬性中,當(dāng)代碼運(yùn)行到第二條時,此時調(diào)用user.getName()方法,這時通過CGLIB賦予的回調(diào)機(jī)制,實(shí)際上調(diào)用 CGLIB$CALBACK_0.getName()方法,當(dāng)調(diào)用該方法時,Hibernate會首先檢查CGLIB$CALBACK_0.target屬性是否為null,如果不為空,則調(diào)用目標(biāo)對象的getName方法,如果為空,則會發(fā)起數(shù)據(jù)庫查詢,生成類似這樣的SQL語句:select * from user where id=’1’;來查詢數(shù)據(jù),并構(gòu)造目標(biāo)對象,并且將它賦值到 CGLIB$CALBACK_0.target屬性中。

這樣,通過一個中間代理對象,Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載,只有當(dāng)用戶真正發(fā)起獲得實(shí)體對象屬性的動作時,才真正會發(fā)起數(shù)據(jù)庫查詢操作。所以實(shí)體的延遲加載是用通過中間代理類完成的,所以只有session.load()方法才會利用實(shí)體延遲加載,因?yàn)橹挥衧ession.load()方法才會返回實(shí)體類的代理類對象。


分享題目:淺析Hibernate實(shí)現(xiàn)實(shí)體對象延遲加載
當(dāng)前地址:http://www.5511xx.com/article/cdseehe.html