2011-05-01 66 views
3

在4.3節的Hibernate文檔中。 「Implementing equals() and hashCode()」他們寫了這樣一句話:當存儲在Set中時,equals()和hashCode()在休眠

「此外,如果一個實例是得救,目前正處於一個Set中,保存它將一個標識值分配給對象如果equals()方法的hashCode()基於標識符值,哈希碼將會改變,破壞Set的契約。「

我不明白它打破了什麼合同,可以從中得到什麼問題。

+2

http://stackoverflow.com/questions/1928191/what-is-the-correct-way-of-overriding-hashcode-and-equals -methods-of-persis在使用_business keys_時有一些很好的答案,**應該幫助避免這些問題。 – andyb 2011-05-01 08:17:29

回答

9

a HashSet(支持HashMap)如果對象的哈希代碼沒有改變,則可以工作。這是因爲它基於它們的哈希碼保存它們。

因此,如果您將hashCode()作爲標識符,並且將沒有標識符的實體放在一起,它們將具有相同的哈希碼。如果它們也是equal(..)(它們將是),將不允許集合中的多個對象。

現在,如果該集合有一些帶有分配標識符的實體,另一個沒有,稍後保存,那麼該集合將具有錯誤的散列碼。

同時檢查this question什麼是關於hashCode()你的選擇和equals(..)