成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Hinerbate單端關聯代理頗析

開發 后端
Hinerbate單端關聯的延遲抓取,則需要采用 其他不同的機制。Hinerbate單端關聯的目標實體必須使用代理,Hihernate在運行期二進制級(通過優異的CGLIB庫), 為持久對象實現了延遲載入代理。

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

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

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

默認的,Hibernate將會使用該類的一個子類。 注意:被代理的類必須實現一個至少包可見的默認構造函數,我們建議所有的持久類都應擁有這樣的構造函數

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

例如:

  1. <class name="Cat" proxy="Cat"> 
  2.     ......  
  3.     <subclass name="DomesticCat"> 
  4.         .....  
  5.     </subclass> 
  6. </class> 

首先,Cat實例永遠不可以被強制轉換為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 

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

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

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

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

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

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

這里CatImpl實現了Cat接口, DomesticCatImpl實現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(); 

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

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

例如:

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

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

◆標志符的getter方法。

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

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

以上是對Hinerbate單端關聯的具體解析。

 

 

 

 

責任編輯:仲衡 來源: JavaEye博客
相關推薦

2009-09-22 13:25:54

Hibernate M

2009-09-23 14:05:08

Hibernate接口

2016-10-14 16:52:03

單表關聯數據信息

2009-09-02 10:59:02

C#單路代理

2023-08-28 08:00:00

人工智能AgentGPT

2023-10-08 10:14:12

2013-04-03 09:27:42

2011-07-12 14:04:58

2017-08-13 08:29:12

VMware客戶端主機

2023-09-08 00:07:41

2009-06-08 21:25:29

Java聲音技術

2010-09-29 14:04:25

RHCE DHCP配置

2021-12-11 19:02:03

函數C++對象

2010-09-16 12:02:44

vpdn pppoe配

2009-10-15 11:10:00

CCNA例題精析VLAN

2010-09-08 16:25:39

SIP協議棧

2010-09-10 09:52:44

開源協議棧

2010-09-13 16:58:13

2011-04-06 11:41:25

Java動態代理

2024-02-04 16:51:47

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲国产精品一区二区www | 一区二区三区国产 | 黄色大片免费观看 | 麻豆精品国产91久久久久久 | 99在线免费观看 | 欧美日韩欧美 | 国产精品久久久久久久久久三级 | 中文字幕在线一区 | 99re视频在线免费观看 | 亚洲一区二区在线视频 | 日韩高清中文字幕 | 91青青草视频 | 国产综合久久久久久鬼色 | 91精品国产综合久久香蕉麻豆 | 91麻豆精品国产91久久久久久 | 四虎成人免费视频 | 中文字幕在线看人 | 亚洲免费在线视频 | 激情国产 | 欧美一级α片 | 欧美午夜激情在线 | 亚洲一区二区三区免费视频 | 欧美日本韩国一区二区三区 | 亚洲国产精品suv | 国产精品美女久久久 | 毛片的网址 | 91社区在线高清 | 欧美久久一区 | 欧美freesex黑人又粗又大 | 欧美日韩国产一区 | 成人三级电影 | av黄色免费在线观看 | 在线视频91 | 久热免费 | 成人免费观看视频 | 国产99久久精品一区二区永久免费 | 久久久久久久一区 | 亚洲精品99 | 日本免费一区二区三区四区 | 欧美日韩视频 | 丁香六月伊人 |