第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

如何使用@NaturalId 正確覆蓋 Hibernate 實(shí)體的等于

如何使用@NaturalId 正確覆蓋 Hibernate 實(shí)體的等于

慕工程0101907 2022-07-20 10:58:00
已經(jīng)多次討論過如何為實(shí)體重新定義 equals/hashCode。我的問題是關(guān)于是否需要使用 equals 中的所有字段??紤]兩種情況。當(dāng)我們將所有字段用于等于時(shí):@Entitypublic class Book {    @Id    @Column    @GeneratedValue(strategy = GenerationType.IDENTITY)    private Long id;    @NaturalId    @Column(name = "isbn", nullable = false, unique = true)    private String isbn;    @Column    private String name;    private Book() {    }    public Book(String isbn) {        this.isbn = isbn;    }    @Override    public boolean equals(Object o) {        if (this == o) return true;        if (o == null || getClass() != o.getClass()) return false;        Book book = (Book) o;        return Objects.equals(id, book.id) &&                Objects.equals(isbn, book.isbn) &&                Objects.equals(name, book.name);    }    @Override    public int hashCode() {        return Objects.hash(isbn);    }}并測(cè)試:public class BookTest1 {    @PersistenceContext    protected EntityManager em;    @Test    public void fromTransientToManageSameEntity() {        Book book1 = new Book("4567-5445-5434-3212");        Book book2 = new Book("4567-5445-5434-3212");        em.persist(book2);        flushAndClean();        assertThat(book1, is(not((equalTo(book2))))); // not equals    }}正如我們所看到的,當(dāng)將實(shí)體從瞬態(tài)轉(zhuǎn)換為管理狀態(tài)時(shí) - 相同的實(shí)體將不相等。另一種情況是當(dāng)我們只使用等于@NaturalId 時(shí):@Overridepublic boolean equals(Object o) {    if (this == o) return true;    if (o == null || getClass() != o.getClass()) return false;    Book book = (Book) o;    return Objects.equals(isbn, book.isbn);}并測(cè)試:public class BookTest2 {    @PersistenceContext    protected EntityManager em;    @Test    public void fromTransientToManageSameEntity() {        Book book1 = new Book("4567-5445-5434-3212");        Book book2 = new Book("4567-5445-5434-3212");        em.persist(book2);        flushAndClean();        assertThat(book1, equalTo(book2)); // equals    }}正如我們所看到的,現(xiàn)在兩個(gè)實(shí)體將是平等的。我的問題是同一實(shí)體在過渡到管理狀態(tài)時(shí)是否應(yīng)該平等。因此,在這種情況下如何正確地重新定義等號(hào)。
查看完整描述

2 回答

?
三國(guó)紛爭(zhēng)

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

根據(jù)這篇文章 equals,hashCode應(yīng)該與狀態(tài)無關(guān)。如果你只覆蓋了第一個(gè),那就不好了,可能會(huì)導(dǎo)致奇怪的錯(cuò)誤。他們需要有一份合同

最簡(jiǎn)單的方法是使用 lombok - 用 注釋您的類,@EqualsAndHashCode(onlyExplicitlyIncluded = true, callSuper = false)并與 比較使用的字段@EqualsAndHashCode.Include。


查看完整回答
反對(duì) 回復(fù) 2022-07-20
?
蠱毒傳說

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>


查看完整回答
反對(duì) 回復(fù) 2022-07-20
  • 2 回答
  • 0 關(guān)注
  • 180 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)