首頁  >  文章  >  Java  >  Hibernate:為什麼在處理多對多關係時`saveOrUpdate`會拋出`NonUniqueObjectException`?

Hibernate:為什麼在處理多對多關係時`saveOrUpdate`會拋出`NonUniqueObjectException`?

Susan Sarandon
Susan Sarandon原創
2024-10-28 18:53:02854瀏覽

 Hibernate: Why Does `saveOrUpdate` Throw `NonUniqueObjectException` When Working with Many-to-Many Relationships?

Hibernate:與多個具有相同身份的對象發生混淆

問題:

嘗試時使用Hibernate 的saveOrUpdate 方法保存或更新對象,會拋出異常:

org.hibernate.NonUniqueObjectException: 具有相同標識符值的不同對像已與會話關聯

  1. 上下文:
  2. 當在相同交易中將一個物件(例如RoleBean)指派給多個實體(例如UserBean 和GroupBean)時,就會出現問題。當物件具有多對多關係時,就會發生這種情況。 例如,在給定場景中,RoleBean#1 最初分配給 GroupBean#1。當嘗試在同一個會話中將其新增至 UserBean#1 時,會遇到異常。
  3. 解決方案:
異常原因是存在兩個不同的會話中 RoleBean 物件的實例。一個實例直接與 UserBean 關聯,而另一個實例透過 GroupBean 間接關聯。

要解決此問題,請考慮以下選項:改用合併saveOrUpdate: 合併操作假定對Hibernate 傳回的分離實例所做的任何變更都應該合併回資料庫,無論身分如何。但是,如果目標物件在中間被修改,合併可能會導致資料遺失。 確保在整個事務中使用同一個 RoleBean 實例:這可以透過仔細實作將正確的實例指派給 UserBean 和 GroupBean。透過維護單一實例,您可以避免建立重複的物件。 考慮使用 JPA 的合併方法:JPA 提供了一種行為類似於 Hibernate 合併的合併方法。它假定對分離實例所做的任何變更都應合併回資料庫中。 透過實作其中一種方法,您可以解決異常並確保正確處理具有相同標識的物件在單一 Hibernate 會話中。

以上是Hibernate:為什麼在處理多對多關係時`saveOrUpdate`會拋出`NonUniqueObjectException`?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn