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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Hibernate使用Person對(duì)象

Hibernate有很多值得學(xué)習(xí)的地方,這里我們主要介紹Hibernate使用Person對(duì)象,包括介紹Person對(duì)象還缺少的是equals()方法和hashCode()方法等方面。

Hibernate映像文件指明了Person的id字段代表了數(shù)據(jù)庫(kù)中的ID列(也就是說(shuō),它是PERSON表的主鍵)。包含在id標(biāo)簽中的unsaved-value="null"屬性告訴Hibernate使用id字段來(lái)判斷一個(gè)Person對(duì)象之前是否被保存過(guò)。ORM框架必須依靠這個(gè)來(lái)判斷保存一個(gè)對(duì)象的時(shí)候應(yīng)該使用SQL的INSERT字句還是UPDATE字句。在這個(gè)例子中,Hibernate假定一個(gè)新對(duì)象的id字段一開(kāi)始為null值,當(dāng)它第一次被保存時(shí)才id才被賦予一個(gè)值。generator標(biāo)簽告訴Hibernate當(dāng)對(duì)象第一次保存時(shí),應(yīng)該從哪里獲得指派的id。在這個(gè)例子中,Hibernate使用數(shù)據(jù)庫(kù)序列作為產(chǎn)生唯一id的來(lái)源。最后,version標(biāo)簽告訴Hibernate使用Person對(duì)象的version字段進(jìn)行并發(fā)控制。Hibernate將會(huì)執(zhí)行樂(lè)觀鎖方案(optimistic locking scheme),根據(jù)這個(gè)方案,Hibernate在保存對(duì)象之前會(huì)檢查對(duì)比對(duì)象的version值和數(shù)據(jù)庫(kù)中相應(yīng)數(shù)據(jù)的version值。

我們的Person對(duì)象還缺少的是equals()方法和hashCode()方法的實(shí)現(xiàn)。既然這是一個(gè)持久化對(duì)象,我們并不想依賴于這兩個(gè)方法的缺省實(shí)現(xiàn),因?yàn)槿笔?shí)現(xiàn)并不能分辨代表數(shù)據(jù)庫(kù)中同一實(shí)體的不同實(shí)例。一種簡(jiǎn)單而又顯然的實(shí)現(xiàn)方法是利用id字段來(lái)進(jìn)行equal()方法的比較以及生成hashCode()方法的結(jié)果。

 
 
 
  1. public boolean equals(Object o) {  
  2. if (this == o) return true;   
  3. if (o == null || !(o instanceof Person))   
  4. return false;  
  5. Person other = (Person)o;   
  6. if (id == other.getId()) return true;   
  7. if (id == null) return false;  
  8. // equivalence by id   
  9. return id.equals(other.getId());  
  10. }  
  11. public int hashCode() {  
  12. if (id != null) {   
  13. return id.hashCode();   
  14. }  
  15. else {  
  16. return super.hashCode();   
  17. }  

不走運(yùn)的是,這個(gè)實(shí)現(xiàn)存在著問(wèn)題。當(dāng)我們首次創(chuàng)建Person對(duì)象的時(shí)候id的值是null,這意味著任何兩個(gè)沒(méi)有被保存的Person對(duì)象都將被認(rèn)為是等價(jià)的。如果我們想創(chuàng)建一個(gè)Person對(duì)象并把它放到Set數(shù)據(jù)結(jié)構(gòu)中,再創(chuàng)建了一個(gè)完全不同的Person對(duì)象也把它放到同一個(gè)Set里面,事實(shí)上第2個(gè)Person對(duì)象并不能被加入。這是因?yàn)镾et會(huì)斷定所有未經(jīng)保存的對(duì)象都是相同的。

你可能會(huì)試探著去實(shí)現(xiàn)一個(gè)只使用被設(shè)置過(guò)的id的equals()方法。畢竟,如果兩個(gè)對(duì)象都沒(méi)有被保存過(guò),我們可以假定它們是不同的對(duì)象。這是因?yàn)樵谒鼈儽槐4娴綌?shù)據(jù)庫(kù)的時(shí)候,它們會(huì)被賦予不同的主鍵。

 
 
 
  1. public boolean equals(Object o) {   
  2. if (this == o) return true;  
  3. if (o == null || !(o instanceof Person)) return false;  
  4. Person other = (Person)o;  
  5. // unsaved objects are never equal   
  6. if (id == null || other.getId() == null) return false;   
  7. return id.equals(other.getId());  

這里有個(gè)隱藏的問(wèn)題。Java的Collection框架在它的生命周期中需要基于不變字段的equals()和hashCode()方法。換句話來(lái)說(shuō),當(dāng)一個(gè)對(duì)象處在Collection中的時(shí)候,你不可以改變equals()和hashCode()的返回值。舉個(gè)例子,下面這段程序:

 
 
 
  1. Person p = new Person();  
  2. Set set = new HashSet();  
  3. set.add(p);  
  4. System.out.println(set.contains(p));  
  5. p.setId(new Long(5));  
  6. System.out.println(set.contains(p));   

以上介紹Hibernate使用Person對(duì)象。

【編輯推薦】

  1. Hibernate Util簡(jiǎn)單討論
  2. 詳解優(yōu)化Hibernate性能經(jīng)驗(yàn)
  3. 概述Hibernate dbcp連接池使用方法
  4. 淺析Hibernate.cfg.xml配置
  5. Hibernate Shard基礎(chǔ)分析

網(wǎng)站欄目:Hibernate使用Person對(duì)象
瀏覽地址:http://m.5511xx.com/article/ccciopp.html