偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

淺析Hibernate實(shí)現(xiàn)實(shí)體對(duì)象延遲加載

開(kāi)發(fā) 后端
這里介紹Hibernate實(shí)現(xiàn)實(shí)體對(duì)象延遲加載,延遲加載機(jī)制是為了避免一些無(wú)謂的性能開(kāi)銷而提出來(lái)的,所謂延遲加載就是當(dāng)在真正需要數(shù)據(jù)的時(shí)候,才真正執(zhí)行數(shù)據(jù)加載操作。

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

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

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

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

  1. <hibernate-mapping> 
  2. <class name=”com.neusoft.entity.User” table=”user” lazy=”true”> 
  3. ……  
  4. </class> 
  5. </hibernate-mapping> 

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

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

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

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

【編輯推薦】

  1. 講解NHibernate Session
  2. 簡(jiǎn)單描述Hibernate Sample
  3. Hibernate Annotations維護(hù)驗(yàn)證邏輯
  4. Hibernate ClassValidator實(shí)例
  5. 描述Hibernate持久性類
責(zé)任編輯:佚名 來(lái)源: InfoQ
相關(guān)推薦

2009-09-24 11:41:46

Hibernate延遲

2009-09-29 16:11:45

Hibernate實(shí)現(xiàn)

2009-06-17 11:18:02

Hibernate延遲

2009-09-25 10:17:21

Hibernate延遲

2009-06-17 14:55:26

Hibernate數(shù)據(jù)

2009-09-28 09:56:53

Hibernate屬性

2009-09-23 13:26:10

Hibernate對(duì)象

2009-09-25 10:49:25

Hibernate加載

2009-09-25 10:47:25

Hibernate延遲

2009-09-28 09:40:28

Hibernate集合延遲加載

2011-11-24 21:03:10

ibmdw

2009-07-02 09:39:37

Hibernate延遲

2009-06-17 15:06:50

Hibernate實(shí)體

2009-09-28 17:23:51

Hibernate E

2009-07-22 11:27:36

iBATIS模糊查詢

2009-08-27 18:09:49

C#接口的實(shí)現(xiàn)

2009-09-24 17:28:29

Hibernate S

2009-06-17 16:00:03

Hibernate自定

2009-09-21 12:50:34

Hibernate架構(gòu)

2009-09-21 18:13:11

Hibernate S
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)