繁体   English   中英

使用 EclipseLink 的 JPA 实体的 equals() 和 hashcode()

[英]equals() and hashcode() for JPA entities using EclipseLink

使用 JPA 时,我偶然发现了equals()hashcode()的问题,尤其是对于尚未持久化的新创建实体。

我在stackoverflow中找到了以下答案:

我应该在 JPA 实体中编写 equals() 方法吗?

这个答案谈论 Hibernate 会话。 我不使用 Hibernate(但 EclipseLink),并且我不知道 JPA 提供程序的实现细节,例如这些“会话”。

我的问题是,就 JPA 而言,Hibernate session 是什么? 或者,更具体地说:如果我不覆盖equals()hashcode() ,在这种情况下,我会遇到表示同一实体的两个对象(相同的业务密钥,如果存在)不“相等”的问题(这意味着equals()返回false)?

使用相同的 EntityManager 实例是否足以避免这些问题(这意味着,“会话”和“实体管理器”可以在这种情况下等效使用吗?)

注意:我没有对所有表都有可用的业务键,因此无法应用在equals()hashcode()中使用业务键属性的解决方案。

EclipseLink 对 equals() 和 hashCode() 没有任何特定要求(即使在 Id 类上也是如此)。

在持久性上下文中维护身份,因此默认的 equals 和 hashCode 将为 function。

对于分离的对象,它们将具有不同的标识,因此 equals 不会返回 true,除非您覆盖它以使用 Id 或其他一些标准。 这不会导致 EclipseLink 出现问题,但您的应用程序可能对此有依赖关系。

一般来说,如果您的对象在 Sets 或 Maps 中使用,则应该正确实现 equals 和 hashCode,但 EclipseLink 始终在内部使用 Identity Maps 和 Sets,因此内部应该没有问题。

您可以有同一实体的两个分离实例,或者一个附加实例和一个分离实例,因此它们不相等,因为默认的 equals 方法比较物理地址。

几乎不可能为没有业务密钥的实体实现良好的 equals 方法。 即使对于具有业务密钥的实体,如果此业务密钥是可变的,我们也注定要失败。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM