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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Hinerbate單端關(guān)聯(lián)代理頗析

在Hinerbate中,對集合的延遲抓取的采用了自己的實現(xiàn)方法。但是,對于Hinerbate單端關(guān)聯(lián)的延遲抓取,則需要采用 其他不同的機制。Hinerbate單端關(guān)聯(lián)的目標(biāo)實體必須使用代理,Hihernate在運行期二進制級(通過優(yōu)異的CGLIB庫), 為持久對象實現(xiàn)了延遲載入代理。

創(chuàng)新互聯(lián)公司是一家專注于成都網(wǎng)站制作、成都網(wǎng)站建設(shè)、外貿(mào)營銷網(wǎng)站建設(shè)與策劃設(shè)計,高臺網(wǎng)站建設(shè)哪家好?創(chuàng)新互聯(lián)公司做網(wǎng)站,專注于網(wǎng)站建設(shè)十余年,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:高臺等地區(qū)。高臺做網(wǎng)站價格咨詢:028-86922220

默認(rèn)的,Hibernate3將會為所有的持久對象產(chǎn)生代理(在啟動階段),然后使用他們實現(xiàn)多對一(many-to-one)關(guān)聯(lián)和一對一(one-to-one) 關(guān)聯(lián)的延遲抓取。

在映射文件中,可以通過設(shè)置proxy屬性為目標(biāo)class聲明一個接口供代理接口使用。

默認(rèn)的,Hibernate將會使用該類的一個子類。 注意:被代理的類必須實現(xiàn)一個至少包可見的默認(rèn)構(gòu)造函數(shù),我們建議所有的持久類都應(yīng)擁有這樣的構(gòu)造函數(shù)

在如此方式定義一個多態(tài)類的時候,有許多值得注意的常見性的問題,

例如:

 
 
  1.  name="Cat" proxy="Cat"> 
  2.     ......  
  3.      name="DomesticCat"> 
  4.         .....  
  5.      
  6.  

首先,Cat實例永遠不可以被強制轉(zhuǎn)換為DomesticCat, 即使它本身就是DomesticCat實例。

 
 
  1. Cat cat = (Cat) session.load(Cat.class, id);  // instantiate a proxy (does not hit the db)  
  2. if ( cat.isDomesticCat() ) {                  // hit the db to initialize the proxy  
  3.     DomesticCat dc = (DomesticCat) cat;       // Error!  
  4.     ....  

其次,代理的“==”可能不再成立。

 
 
  1. Cat cat = (Cat) session.load(Cat.class, id);            // instantiate a Cat proxy  
  2. DomesticCat dc =   
  3.         (DomesticCat) session.load(DomesticCat.class, id);  // acquire new DomesticCat proxy!  
  4. System.out.println(cat==dc);                            // false 

雖然如此,但實際情況并沒有看上去那么糟糕。雖然我們現(xiàn)在有兩個不同的引用,分別指向這兩個不同的代理對象, 但實際上,其底層應(yīng)該是同一個實例對象:

 
 
  1. cat.setWeight(11.0);  // hit the db to initialize the proxy  
  2. System.out.println( dc.getWeight() );  // 11.0 

第三,你不能對“final類”或“具有final方法的類”使用CGLIB代理。

***,如果你的持久化對象在實例化時需要某些資源(例如,在實例化方法、默認(rèn)構(gòu)造方法中), 那么代理對象也同樣需要使用這些資源。實際上,代理類是持久化類的子類。

這些問題都源于Java的單根繼承模型的天生限制。如果你希望避免這些問題,那么你的每個持久化類必須實現(xiàn)一個接口, 在此接口中已經(jīng)聲明了其業(yè)務(wù)方法。然后,你需要在映射文檔中再指定這些接口。例如:

 
 
  1.  name="CatImpl" proxy="Cat"> 
  2.     ......  
  3.      name="DomesticCatImpl" proxy="DomesticCat"> 
  4.         .....  
  5.      
  6.  

這里CatImpl實現(xiàn)了Cat接口, DomesticCatImpl實現(xiàn)DomesticCat接口。 在load()、iterate()方法中就會返回 Cat和DomesticCat的代理對象。 (注意list()并不會返回代理對象。)

 
 
  1. Cat cat = (Cat) session.load(CatImpl.class, catid);  
  2. Iterator iter = session.iterate("from CatImpl as cat where cat.name='fritz'");  
  3. Cat fritz = (Cat) iter.next(); 

這里,對象之間的關(guān)系也將被延遲載入。這就意味著,你應(yīng)該將屬性聲明為Cat,而不是CatImpl。

但是,在有些方法中是不需要使用代理的。

例如:

◆equals()方法,如果持久類沒有重載equals()方法。

◆hashCode()方法,如果持久類沒有重載hashCode()方法。

◆標(biāo)志符的getter方法。

Hibernate將會識別出那些重載了equals()、或hashCode()方法的持久化類。

若選擇lazy="no-proxy"而非默認(rèn)的lazy="proxy",我們可以避免類型轉(zhuǎn)換帶來的問題。然而,這樣我們就需要編譯期字節(jié)碼增強,并且所有的操作都會導(dǎo)致立刻進行代理初始化。

以上是對Hinerbate單端關(guān)聯(lián)的具體解析。


網(wǎng)頁題目:Hinerbate單端關(guān)聯(lián)代理頗析
網(wǎng)站網(wǎng)址:http://m.5511xx.com/article/coeoghi.html