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

Hibernate映像文件指明了Person的id字段代表了數(shù)據(jù)庫中的ID列(也就是說,它是PERSON表的主鍵)。包含在id標(biāo)簽中的unsaved-value="null"屬性告訴Hibernate使用id字段來判斷一個Person對象之前是否被保存過。ORM框架必須依靠這個來判斷保存一個對象的時候應(yīng)該使用SQL的INSERT字句還是UPDATE字句。在這個例子中,Hibernate假定一個新對象的id字段一開始為null值,當(dāng)它第一次被保存時才id才被賦予一個值。generator標(biāo)簽告訴Hibernate當(dāng)對象第一次保存時,應(yīng)該從哪里獲得指派的id。在這個例子中,Hibernate使用數(shù)據(jù)庫序列作為產(chǎn)生唯一id的來源。最后,version標(biāo)簽告訴Hibernate使用Person對象的version字段進(jìn)行并發(fā)控制。Hibernate將會執(zhí)行樂觀鎖方案(optimistic locking scheme),根據(jù)這個方案,Hibernate在保存對象之前會檢查對比對象的version值和數(shù)據(jù)庫中相應(yīng)數(shù)據(jù)的version值。
我們的Person對象還缺少的是equals()方法和hashCode()方法的實(shí)現(xiàn)。既然這是一個持久化對象,我們并不想依賴于這兩個方法的缺省實(shí)現(xiàn),因?yàn)槿笔?shí)現(xiàn)并不能分辨代表數(shù)據(jù)庫中同一實(shí)體的不同實(shí)例。一種簡單而又顯然的實(shí)現(xiàn)方法是利用id字段來進(jìn)行equal()方法的比較以及生成hashCode()方法的結(jié)果。
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || !(o instanceof Person))
- return false;
- Person other = (Person)o;
- if (id == other.getId()) return true;
- if (id == null) return false;
- // equivalence by id
- return id.equals(other.getId());
- }
- public int hashCode() {
- if (id != null) {
- return id.hashCode();
- }
- else {
- return super.hashCode();
- }
- }
不走運(yùn)的是,這個實(shí)現(xiàn)存在著問題。當(dāng)我們首次創(chuàng)建Person對象的時候id的值是null,這意味著任何兩個沒有被保存的Person對象都將被認(rèn)為是等價的。如果我們想創(chuàng)建一個Person對象并把它放到Set數(shù)據(jù)結(jié)構(gòu)中,再創(chuàng)建了一個完全不同的Person對象也把它放到同一個Set里面,事實(shí)上第2個Person對象并不能被加入。這是因?yàn)镾et會斷定所有未經(jīng)保存的對象都是相同的。
你可能會試探著去實(shí)現(xiàn)一個只使用被設(shè)置過的id的equals()方法。畢竟,如果兩個對象都沒有被保存過,我們可以假定它們是不同的對象。這是因?yàn)樵谒鼈儽槐4娴綌?shù)據(jù)庫的時候,它們會被賦予不同的主鍵。
- public boolean equals(Object o) {
- if (this == o) return true;
- if (o == null || !(o instanceof Person)) return false;
- Person other = (Person)o;
- // unsaved objects are never equal
- if (id == null || other.getId() == null) return false;
- return id.equals(other.getId());
- }
這里有個隱藏的問題。Java的Collection框架在它的生命周期中需要基于不變字段的equals()和hashCode()方法。換句話來說,當(dāng)一個對象處在Collection中的時候,你不可以改變equals()和hashCode()的返回值。舉個例子,下面這段程序:
- Person p = new Person();
- Set set = new HashSet();
- set.add(p);
- System.out.println(set.contains(p));
- p.setId(new Long(5));
- System.out.println(set.contains(p));
以上介紹Hibernate使用Person對象。
【編輯推薦】
- Hibernate Util簡單討論
- 詳解優(yōu)化Hibernate性能經(jīng)驗(yàn)
- 概述Hibernate dbcp連接池使用方法
- 淺析Hibernate.cfg.xml配置
- Hibernate Shard基礎(chǔ)分析
文章標(biāo)題:Hibernate使用Person對象
文章位置:http://m.biofuelwatch.net/article/ccciopp.html


咨詢
建站咨詢
