2 回答

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊

TA貢獻(xiàn)1895條經(jīng)驗(yàn) 獲得超3個(gè)贊
當(dāng)我前一陣子研究這個(gè)問題時(shí),我得出結(jié)論,沒有一個(gè)正確的答案。
我最終只檢查了and中的@Id屬性,因?yàn)檫@似乎表現(xiàn)最好。(我們不使用任何s;它可以代替它,但堅(jiān)持使用 s 可能更安全。)equals()hashCode()@NaturalId@Id
我認(rèn)為我發(fā)現(xiàn)的唯一潛在問題是,如果一個(gè)新實(shí)例在被持久化之前被添加到集合中。實(shí)際上,這在我們的項(xiàng)目中從未發(fā)生過,因此效果很好。(如果在您的項(xiàng)目中確實(shí)如此,您可能仍然會(huì)發(fā)現(xiàn)這是最好的權(quán)衡,以避免當(dāng)持久對(duì)象出現(xiàn)在集合中時(shí)出現(xiàn)問題,這更常見。)
正如其他答案所指出的那樣,如果您覆蓋,equals()您還必須覆蓋hashCode(),以確保相等的對(duì)象始終具有相同的哈希碼。(問題的第一個(gè)示例確實(shí)符合這一點(diǎn),盡管這兩種方法不檢查所有相同的字段可能有點(diǎn)令人困惑。)
順便說一下,在 Kotlin 中,這兩種方法變得易于管理:
override fun equals(other: Any?) = other === this
|| (other is MyEntity && entityId == other.entityId)
override fun hashCode() = entityId
(我為什么喜歡 Kotlin 的另一個(gè)例子?。?/p>
添加回答
舉報(bào)