自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

簡(jiǎn)述Hibernate兩種方法的實(shí)現(xiàn)

開(kāi)發(fā) 后端
實(shí)現(xiàn)Hibernate equals()/HibernatehashCode()最顯而易見(jiàn)的方法是比較兩個(gè)對(duì)象標(biāo)識(shí)符的值。如果值相同,則兩個(gè)對(duì)象對(duì)應(yīng)于數(shù)據(jù)庫(kù)的同一行,因此它們是相等的(如果都被添加到 Set,則在Set中只有一個(gè)元素)。

Hibernate有很多方法,每一種方法都有自己實(shí)現(xiàn)的過(guò)程,這里詳述Hibernate兩種方法的實(shí)現(xiàn)Hibernate equals()和Hibernate hashCode()。

實(shí)現(xiàn)Hibernate equals()和hashCode()如果你有如下需求,你必須重載 equals() 和 hashCode()方法:

想把持久類的實(shí)例放入Set中(當(dāng)表示多值關(guān)聯(lián)時(shí),推薦這么做)

想重用脫管實(shí)例

Hibernate保證,僅在特定會(huì)話范圍內(nèi),持久化標(biāo)識(shí)(數(shù)據(jù)庫(kù)的行)和Java標(biāo)識(shí)是等價(jià)的。因此,一旦 我們混合了從不同會(huì)話中獲取的實(shí)例,如果希望Set有明確的語(yǔ)義,就必 須實(shí)現(xiàn)equals() 和hashCode()。

實(shí)現(xiàn)Hibernate equals()/HibernatehashCode()最顯而易見(jiàn)的方法是比較兩個(gè)對(duì)象標(biāo)識(shí)符的值。如果值相同,則兩個(gè)對(duì)象對(duì)應(yīng)于數(shù)據(jù)庫(kù)的同一行,因此它們是相等的(如果都被添加到 Set,則在Set中只有一個(gè)元素)。

不幸的是,對(duì)生成的標(biāo)識(shí)不能 使用這種方法。Hibernate僅對(duì)那些持久化對(duì)象賦標(biāo)識(shí)值,一個(gè)新創(chuàng)建的實(shí)例將不會(huì)有任何標(biāo)識(shí)值。此外, 如果一個(gè)實(shí)例沒(méi)有被保存(unsaved),并且它當(dāng)前正在一個(gè)Set中,保存它將會(huì)給這個(gè)對(duì)象 賦一個(gè)標(biāo)識(shí)值。

如果Hibernate equals() 和Hibernate hashCode()是基于標(biāo)識(shí)值 實(shí)現(xiàn)的,則其哈希碼將會(huì)改變,這違反了Set的契約。建議去Hibernate的站點(diǎn)閱讀關(guān)于這個(gè) 問(wèn)題的全部討論。

注意:這不是Hibernate的問(wèn)題,而是一般的Java對(duì)象標(biāo)識(shí)和Java對(duì)象等價(jià)的語(yǔ)義問(wèn)題。

我們建議使用業(yè)務(wù)鍵值相等(Business key equality)來(lái)實(shí)現(xiàn)equals() 和 hashCode()。業(yè)務(wù)鍵值相等的意思是,equals()方法 僅僅比較形成業(yè)務(wù)鍵的屬性,它能在現(xiàn)實(shí)世界里標(biāo)識(shí)我們的實(shí)例(是一個(gè)自然的候選碼)。

  1. public class Cat {  
  2.  
  3.     ...  
  4.     public boolean equals(Object other) {  
  5.         if (this == other) return true;  
  6.         if ( !(other instanceof Cat) ) return false;  
  7.  
  8.         final Cat cat = (Cat) other;  
  9.  
  10.         if ( !cat.getLitterId().equals( getLitterId() ) ) return false;  
  11.         if ( !cat.getMother().equals( getMother() ) ) return false;  
  12.  
  13.         return true;  
  14.     }  
  15.  
  16.     public int hashCode() {  
  17.         int result;  
  18.         result = getMother().hashCode();  
  19.         result = 29 * result + getLitterId();  
  20.         return result;  
  21.     }  
  22.  

注意:

業(yè)務(wù)鍵不必像數(shù)據(jù)庫(kù)的主鍵那樣固定不變。對(duì)業(yè)務(wù)鍵而言,不可變或唯一的屬性是不錯(cuò)的選擇。

【編輯推薦】

  1. 簡(jiǎn)述Hibernate中加載并存儲(chǔ)對(duì)象
  2. Hibernate傳播性持久化攻略
  3. 深入了解Hibernate自動(dòng)狀態(tài)檢測(cè)
  4. 解讀Hibernate高級(jí)集合映射
  5. Hinerbate單端關(guān)聯(lián)代理頗析
責(zé)任編輯:仲衡 來(lái)源: javanb
相關(guān)推薦

2010-09-07 11:18:10

2010-07-26 15:42:34

Perl模塊

2011-07-14 17:50:50

domino數(shù)據(jù)庫(kù)

2010-08-04 17:41:52

掛載NFS

2010-08-03 13:53:47

Flex+Java配置

2009-04-21 11:23:56

Oraclespool比較

2010-04-13 09:50:44

Oracle跟蹤

2010-11-24 14:36:25

修復(fù)mysql表

2011-03-30 17:04:24

MySQL添加用戶

2024-01-02 11:45:00

讀取requestmap

2009-08-05 15:54:49

Web Service

2010-02-06 14:35:36

ibmdwRUP迭代

2009-06-18 11:09:42

2009-08-05 13:34:18

C#日期相減

2010-11-12 11:44:37

SQL Server刪

2010-09-09 19:53:50

2019-09-15 17:35:28

Wireshark解密HTTPS

2020-09-16 18:27:36

Linux方法IP地址

2009-11-03 16:20:16

VB.NET文本框

2009-11-06 09:48:40

WCF服務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)