Ole*_*Ole 3 java hibernate jpa kotlin
Kotlin有一个附带的 Data 类toString(), equals(), hashCode(), and copy()。
是否可以equals() and hashCode()“直接开箱即用”而无需进一步调整 JPA 类?在确信我们正在做正确的事情之前,我们通常必须花费大量时间阅读下面链接的文章中的“自然键”、持久性上下文生命周期等:
我们现在可以简单地依赖 Kotlin 的equals() and hashcode()实现吗?
在我看来,除非您真正了解自己在做什么,否则不应使用 Kotlin 中的数据类。
覆盖可变数据上的equals/hashCode可能会导致问题。假设您已将可变类的实例添加到HashSet,然后更改了该实例的一些 if 属性。这会影响返回的值hashCode。
反过来,这使得不可能HashSet找到该实例,因为它将在完全不同的哈希表条目中查找它。您将无法从中删除此实例HashSet!
kotlin 中候选数据类的好例子有:复数、常量大小的向量。不好的例子有:JPA 实体、DTO。
至于 JPA,这些文章都是有观点的。还有另一种观点:您根本不应该覆盖 JPA 实体的equalsand 。hashCode
基本原理:JPA 提供者(Hibernate、EclipseLink)必须保证当且a === b仅当 a 和 b 在表中具有相同的主键,并且 a 和 b 都处于持久状态。对于独立实体,本合同可能会被打破。但是,在我看来,与独立实体合作是一种应该避免的不良做法。唯一可能有意义的事情是存储分离的实体以将它们合并到另一个 JPA 事务中。