[英]Correct way of Implementation of equals() method for JPA entities
我已經使用Eclipse通過選擇感興趣的字段/屬性來為我的JPA實體生成hashcode()
和equals()
方法。
但是,我發現Eclipse似乎在生成的equals
方法中添加了以下幾行:
if (getClass() != obj.getClass())
return false;
進行上述檢查似乎合乎邏輯,但是我在所有JPA實體中都使用LAZY加載的關系,並且我觀察到在某些情況下,當obj
的類是某種代理類並且主對象是obj
的類時,上述檢查失敗有問題的實體-我檢查了要比較的對象的類,並且兩者並不完全相同,因此,即使對象表示數據庫中的相同記錄,上述條件的評估結果也是false
。
因此,我的查詢是在為JPA實體實現equals()
方法時是否應該比較對象的類。
建議對JPA實體使用業務密鑰相等性 。 自動生成的等於使用所有字段。
您的實體很可能具有自動生成的技術主鍵(id字段)。 實體保留后,該字段由數據庫填充。 如果您具有自動生成的equals / hashcode,它將包括所有類字段,包括該id字段。 因此,您的實體的equals / hashcode將在您將其持久化后更改,而不會更改任何其他字段(持久化ID之前為null,持久化之后不為null)。
有關更多詳細信息,請閱讀https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html
這是Hibernate參考,但是與主鍵有關的所有概念都應適用於任何JPA提供程序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.