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

Hibernate使用Person對象

開發 后端
這里介紹Hibernate使用Person對象的version字段進行并發控制,Hibernate將會執行樂觀鎖方案,根據這個方案,Hibernate在保存對象之前會檢查對比對象的version值和數據庫中相應數據的version值。

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

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

我們的Person對象還缺少的是equals()方法和hashCode()方法的實現。既然這是一個持久化對象,我們并不想依賴于這兩個方法的缺省實現,因為缺省實現并不能分辨代表數據庫中同一實體的不同實例。一種簡單而又顯然的實現方法是利用id字段來進行equal()方法的比較以及生成hashCode()方法的結果。

  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. }  

不走運的是,這個實現存在著問題。當我們首次創建Person對象的時候id的值是null,這意味著任何兩個沒有被保存的Person對象都將被認為是等價的。如果我們想創建一個Person對象并把它放到Set數據結構中,再創建了一個完全不同的Person對象也把它放到同一個Set里面,事實上第2個Person對象并不能被加入。這是因為Set會斷定所有未經保存的對象都是相同的。

你可能會試探著去實現一個只使用被設置過的id的equals()方法。畢竟,如果兩個對象都沒有被保存過,我們可以假定它們是不同的對象。這是因為在它們被保存到數據庫的時候,它們會被賦予不同的主鍵。

  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());  

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

  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對象。

【編輯推薦】

  1. Hibernate Util簡單討論
  2. 詳解優化Hibernate性能經驗
  3. 概述Hibernate dbcp連接池使用方法
  4. 淺析Hibernate.cfg.xml配置
  5. Hibernate Shard基礎分析
責任編輯:佚名 來源: IT168
相關推薦

2012-02-08 14:24:35

HibernateJava

2009-09-29 10:46:58

Hibernate領域

2009-09-25 13:14:58

Hibernate C

2009-09-22 11:27:41

模型對象Hibernate

2009-09-23 13:26:10

Hibernate對象

2009-09-24 15:42:44

Hibernate對象

2009-09-23 10:41:10

對象標識符Hibernate

2009-09-25 14:41:15

Hibernate對象

2012-02-08 12:17:38

HibernateJava

2009-09-29 16:11:45

Hibernate實現

2009-09-28 13:43:28

使用Hibernate

2009-09-29 16:48:42

Hibernate J

2009-09-25 13:55:05

Hibernate使用

2009-06-30 16:52:30

DetchedCrit

2009-09-21 17:23:49

Hibernate使用

2009-09-23 10:28:49

使用Hibernate

2009-09-24 17:28:29

Hibernate S

2009-06-30 16:41:12

Hibernate的事

2012-02-08 14:01:18

HibernateJava

2009-06-17 15:06:50

Hibernate實體
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日日久 | 欧美一区二区在线观看 | 色综合国产 | 爽爽免费视频 | 拍真实国产伦偷精品 | 一区二区三区免费 | 国产不卡在线 | 一级黄在线观看 | 亚洲一区二区免费视频 | 久久精品国产亚洲一区二区 | 中文字幕国产视频 | 日韩一区在线观看视频 | 日韩视频在线播放 | 亚洲视频免费观看 | 久久成人18免费网站 | 夜夜摸天天操 | 亚洲一区二区三区在线视频 | 亚洲精品在线免费 | 久久久国产亚洲精品 | 欧美精品一区二区三区在线播放 | 中文字幕在线播放第一页 | 欧美一级毛片在线播放 | 欧美久久不卡 | 亚洲 欧美 综合 | 欧美精品久久久久 | 欧美视频二区 | 在线观看日本高清二区 | 九九伦理片 | 国产免费拔擦拔擦8x高清 | 一区二区在线不卡 | 99re在线 | 国产精品美女久久久av超清 | 99精品久久久久 | 久久久青草婷婷精品综合日韩 | dy天堂| 高清视频一区二区三区 | 91精品久久久 | 久久久精品网站 | 羞羞的视频在线 | 亚洲巨乳自拍在线视频 | 精品国产一区二区三区在线观看 |