2014-03-25 73 views
11

我正在使用JPA並獲得以下警告。我研究了這一點,並理解爲什麼我需要重寫它,以及Hibernate如何使用這些方法。我還有雖然問題:JPA /休眠「複合id類不覆蓋等於()」

例外:

複合-ID類沒有重載equals()

問:

爲什麼休眠只在乎關於沒有組合ID的類?如果只有一個存在,那麼在@Id字段中默認情況下會比較嗎?還是有更復雜的情況發生?

回答

11

因爲當實體沒有組合ID時,它們只有一個基本支持類型(Integer,Long,String等),並且這些類已經有一個明確定義的equals()(和hashCode())方法。

+0

那麼,我是否需要創建一個主鍵類,還是可以在類中使用2個@Id標量字段並覆蓋等號呢? –

+2

您應該避免使用複合鍵。這就是你應該做的。如果你真的不能,因爲你的目標是一個無法改變的現有模式,那麼你應該定義一個PK類,是的。 –

+1

很感謝,我會接受。但是最後一個問題......如何避免在正常的多對多非規範化場景中需要一個只包含2個外鍵的表?您可以讓第三個自動生成的密鑰作爲主鍵,但隨後該密鑰在不同的數據中心中會有所不同,這是一個令人討厭的問題,並且極大地增加了調試的複雜性。 –

1

使用JPA當您使用複合鍵,你應該使用IdClassEmbeddedId使用其中的任何您需要創建一個自己的類,它作爲一個複合鍵,以便能夠比較使用該組合鍵的對象,其是EntityManager中的幾個操作所要求的,其中密鑰類必須覆蓋equalshashCode

從規格以:

複合主鍵必須對應於一個單一的持久字段或屬性或一組這樣的字段或如下所述的特性。主鍵類必須定義爲表示複合主鍵。當數據庫密鑰由多個列組成時,通常會在從傳統數據庫進行映射時出現複合主鍵。 EmbeddedIdIdClass註釋用於表示複合主鍵。

而且當使用複合主鍵時必須遵循。

  1. 主鍵類必須是公共的,並且必須具有公共的無參數構造函數。
  2. 主鍵類必須是可序列化的。
  3. 主鍵類必須定義equalshashCode方法。這些方法的值相等的語義必須與密鑰映射到的數據庫類型的數據庫相等性一致。
+0

所以,我不能有一個具有多個@Id列的類,只是覆蓋等於那裏? –