2011-03-24 83 views
1

有沒有一種方法來防止與自動生成主鍵的實體上的hibernate重複的數據輸入?休眠如何防止與生成的ID重複條目

更具體地說,我有一個數據庫中的持久對象,並有一個臨時對象(尚未插入到數據庫中),這兩個對象與equals和hashcode方法相同。但是,由於這些對象的實體類的id使用生成的值註釋進行了註釋,因此hibernate仍會爲數據庫中的瞬態對象創建一個新實例。因此,數據庫具有不同主鍵的重複項(相對於等號和散列碼方法)。

是的,我知道如果我不自動生成PK,如果我使用UUID,那麼我會實現我的目標。但我只想問,爲什麼equals和hashcode方法不適用於自動生成主鍵的實體?或者我做錯了什麼?

回答

0

在數據庫級別強制約束。如果沒有這個,很難(不可能?)避免重複,特別是如果你的應用程序是羣集的。

4

爲什麼equals和hashCode方法不起作用

Hibernate不尊重equals()/hashCode()這裏,因爲沒有有效的方式來做到這一點。

Hibernate如何檢查數據庫中已存在的具有相同標識(根據equals())的對象?由於equals()可以包含任意條件,因此Hibernate無法將其轉換爲SQL查詢,因此檢查它的唯一方法是將所有對象加載到內存中,並調用equals()以將它們與要保存的對象進行比較。

因此Hibernate使用主鍵來定義對象的身份。

或者我做錯了什麼?

目前尚不清楚你打算做什麼。如果您希望Hibernate使用您傳入的對象的狀態更新數據庫中的對象,則需要使用merge()

參見:

2

您在數據庫級別應使用相同的字段,你用它來測試在應用層面的平等主鍵。如果你真的需要一個代理鍵(出於性能原因,也許?)在這些字段上強制執行一個「唯一索引」,並讓hibernate拋出異常。