2017-10-19 54 views
1

Kotlin有一個數據類,它自帶toString(), equals(), hashCode(), and copy()可以使用Kotlin數據類equals()方法,而不需要與JPA一起進一步修改?

可以使用equals() and hashCode()「直接開箱即用」,無需進一步調整JPA類?我們通常感覺有信心,我們正在做正確的事情之前,要花費大量的時間在「自然鍵」,持久化上下文的生命週期等在下面鏈接的文章讀了:

我們現在可以簡單地依靠Kotlin的equals() and hashcode()實現嗎?

+0

號的數據類的equals方法使用的所有字段,包括自動生成的ID,要比較的實體。 –

回答

3

在我看來,不應該使用Kotlin中的數據類,除非你真的明白你在做什麼。

覆蓋equals/hashCode關於可變數據可能會導致問題。 考慮你已經添加了一個可變類的實例HashSet,然後改變了一些,如果該實例的屬性。 這會影響hashCode返回的值。

反過來,這使得HashSet找不到該實例,因爲它會在完全不同的散列表條目中查找它。 您將無法從HashSet中刪除此實例!

在kotlin中作爲數據類的候選者的好例子是:複數,恆定大小的向量。不好的例子是:JPA實體,DTO。

至於JPA,這些文章都是有見地的。 還有另一種意見:根本不應該爲JPA實體覆蓋equalshashCode

理由:JPA提供商(休眠,的EclipseLink)必須保證a === b當且僅當a和b具有在表相同的主鍵,和a和b是在持久狀態。 此合約可能會因分離實體而中斷。 但是,在我看來,與分離實體合作是一個不好的做法,應該避免。 這種可能有意義的事情是將分離的實體存儲在另一個JPA事務中。

1

JPA實體應該依賴於對象標識,而不是主鍵相等 - 這大概是對象關係映射的全部內容的90%。讓JPA實現跳過各種循環來創建,維護和傳播Identity Map,然後忽略它可能意味着您根本不需要JPA,並且會導致問題。特別是如果你不是100%知道你在做什麼。

這就是說,也許你可以使用在許多情況下科特林數據類,但前提是:

  • 你不存儲在地圖持久化對象,並設置
  • 保持默認的構造函數和不嘗試觸摸對象初始化以任何方式(提供默認值等)
相關問題