日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Hibernate 實體對象的識別

 feimishiwo 2014-04-29
 
實體對象的識別:
   在基本的Java編程中,對象的識別也是一個必須要面對的問題,在Java中可以通過”==”運算符來判斷兩個對象是否具有相同的引用,還可以通過從根類Object繼承而來的”equals()”方法,來判斷兩個對象的值是否相等?;谶@兩個Java提供的工具,我們可以輕松的判斷兩個對象的差別,但是在面對持久化邏輯時,這兩個工具就遇到了它愛莫能助的新問題,比如我們現(xiàn)在有兩個實體類,一個代表用戶我們稱為User,另一個代表用戶的地址我們稱為Address,并且UserAddress是一對多的關(guān)聯(lián)關(guān)系。
我們看以下代碼:
User user1=session.load(User.class,”1”);
user1.setAge(“27”);
User user2=session.load(User.class,”1”);
依照基本的Java編程規(guī)則user1user2無論是引用還是值都不相同,但是user1user2在數(shù)據(jù)庫中確實是代表同一條記錄,因此他們其實具備等價關(guān)系。怎樣才能準確的確定實體對象的身份?站在數(shù)據(jù)庫的角度,一條記錄可以由主鍵來唯一確定,所以我們可以這樣作出約定,只要兩個實體的主鍵值相等,那么這兩個實體對象就代表同一個實體對象。
  Hibernate而言,這個規(guī)則一樣成立,在Hibernate中,net.sf.hibernate.engine.Key(在Hibernate3中是org.hibernate.engine.Key類)類封裝了用于區(qū)別兩個實體的信息。在這個類中,主要有三個信息,分別是實體對象的Class對象,實體類的名稱,實體ID,通過ID Hibernate就可以將代表不同記錄數(shù)據(jù)的實體對象區(qū)分開。另外Key類還有作為實體對象在緩存中標識的作用,Hibernate會根據(jù)Key在緩存中尋找是否有對應(yīng)的實體對象。所以在實際開發(fā)中,當(dāng)我們使用一些自動生成實體類的工具時,這些工具都會為我們自動生成,這個實體類的equals()方法和hashCode()方法,來實現(xiàn)上述規(guī)則,以便能夠在實體對象比較時,自動區(qū)分不同的實體對象,比如User類會生成如下的equals()hashCode()方法:
public boolean equals(Object other){
 if(this==other) return true;
 if(!other instanceof User) return false;
 User castother=(User)other;
 return new EqualsBuilder().append(this.getId(),castother.getId()).isEquals();
}
public int hashCode(){
 return new HashCodeBuilder().append(getId()).toHashCode();
}
以上的代碼實現(xiàn)了我們約定的邏輯,當(dāng)兩個實體主鍵相同時,我們就認為這兩個實體表示的是兩個相同的實體對象。
這種處理在通常情況下是不會出問題的,在我們平常的開發(fā)中也很少遇到問題,但是很少并不代表沒有問題,我們來看下面的代碼:
User user=(User)session.load(User.class,”1”);
Iterator it=user.getAddress().iterator();
Address addr=(Address)it.next();
 
User user2=(User)session2.load(User.class,”1”);
Iterator it2=user2.getAddress().iterator();
user2.getAddress().add(addr);
Transaction trans=session.beginTransaction();
session2.save(user2);
session.commit();
這段代碼在執(zhí)行時,會拋出NonUniqueObjectException異常,為什么會這樣?這是因為,我們將從第一個Session中加載的Address對象,放入了由第二個Session所加載的同一個User對象的Set集合中,這時我們上述的規(guī)則將會失效,因為這個規(guī)則無法支持實體的跨Session識別。這種情況在實際開發(fā)中比較少見,但是作為合格開發(fā)人員,應(yīng)該清楚這個情況的存在。如果在開發(fā)中真的出現(xiàn)這種情況時,該怎么辦呢?這時我們就要通過值比對來覆蓋equals()/hashCode()方法,所謂值比對就是就是將實體中所有的屬性,挨個進行值比較和生成hash碼,只要有一個屬性不相同,我們就認為這兩個實體是不同的兩個實體。有時候值比對方法,還會用在有業(yè)務(wù)主鍵的時候,比如說如果兩個User的名字相同,那么這兩個實體就相同,這時屬性Name就是業(yè)務(wù)主鍵,這時必須在User實體類的equals()方法實現(xiàn)對名字的值比較,并且針對Name生成Hash碼。
注意:通常業(yè)務(wù)主鍵是由業(yè)務(wù)邏輯決定的。
 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多