2011-06-30 68 views
4

使用JPA,我偶然發現了equals()hashcode()的問題,特別是對於尚未保留的新創建的實體。使用EclipseLink的JPA實體的equals()和hashcode()

我發現在計算器如下回答:

Hibernate的會話

Should I write equals() methods in JPA entities?

這個答案會談。我不使用Hibernate(但EclipseLink),我不知道JPA提供者的實現細節,比如這些「會話」。

我的問題是,根據JPA什麼是Hibernate會話?或者更具體地說:如果我不覆蓋equals()hashcode(),在這種情況下,我會遇到代表同一實體的兩個對象(如果存在相同業務密鑰)不相等的問題(這表示equals()返回假)?

將使用同一EntityManager實例足以沒有得到這些問題

注意(這意味着,可以在「會話」和「EntityManager的」在此背景下使用的相同呢?)我沒有可用所有表的業務密鑰,因此無法應用equals()hashcode()中使用業務密鑰屬性的解決方案。

回答

1

您可能有兩個相同實體的分離實例,或者一個分離的實例,因此它們不會相同,因爲默認的equals方法會比較物理地址。

對於沒有業務密鑰的實體,實現好的等價方法幾乎是不可能的。即使對於具有商業密鑰的實體,如果這個商業密鑰是可變的,我們也註定要失敗。

6

EclipseLink對equals()和hashCode()(即使對於Id類)沒有任何特定要求。

在持久性上下文中維護標識,所以默認的equals和hashCode會起作用。

對於分離的對象,它們將具有不同的標識,所以除非您重寫它以使用Id或其他條件,否則equals將不會返回true。這不會導致EclipseLink的問題,但您的應用程序可能依賴於此。

一般equals和hashCode應該得到正確執行,如果你的對象是在設置或地圖使用,但是始終的EclipseLink身份使用地圖和內部設置,所以應該有內部沒有問題。

+0

另外,至於這是一個權威的答案:[見詹姆斯的個人資料](http://stackoverflow.com/users/416206/james)! – Arjan

+0

@James:EclipseLink總是使用標識集(是)(仍)是否正確?我們有一個特別糟糕的hashCode實現,並且在刪除時遇到了巨大的性能問題。查看UnitOfWorkImpl的代碼,我發現刪除依賴關係都是使用vanilla HashMap/HashSets進行跟蹤的。這是一個錯誤還是設計?無論哪種方式,似乎與EclipseLink不需要這些方法中的任何內容的想法相矛盾。 –

相關問題