JPA hashCode() / equals() 困境 [关闭]

2024-06-26

曾经有过some https://stackoverflow.com/questions/4762573/should-embeddable-jpa-class-implement-equals-and-hashcode 讨论 https://stackoverflow.com/questions/3147166/how-to-implement-equals-and-hashcode-methods-in-baseentity-of-jpa这里关于 JPA 实体以及哪些hashCode()/equals()应该将实现用于 JPA 实体类。其中大多数(如果不是全部)都依赖于 Hibernate,但我想以 JPA 实现中立的方式讨论它们(顺便说一句,我正在使用 EclipseLink)。

所有可能的实现都有自己的优点 and 缺点关于:

  • hashCode()/equals()合同一致性(不变性)对于List/Set运营
  • Whether 完全相同的可以检测到对象(例如来自不同会话、来自延迟加载数据结构的动态代理)
  • 实体的行为是否正确分离(或非持久)状态

据我所知,有三个选项:

  1. Do not override them; rely on Object.equals() and Object.hashCode()
    • hashCode()/equals() work
    • 无法识别相同的对象,动态代理的问题
    • 分离实体没有问题
  2. Override them, based on the primary key
    • hashCode()/equals()坏了
    • 正确的身份(对于所有托管实体)
    • 分离实体的问题
  3. Override them, based on the Business-Id (non-primary key fields; what about foreign keys?)
    • hashCode()/equals()坏了
    • 正确的身份(对于所有托管实体)
    • 分离实体没有问题

我的问题是:

  1. 我是否错过了一个选项和/或优点/缺点?
  2. 你选择了什么选项,为什么?



更新1:

By "hashCode()/equals()都坏了”,我的意思是连续的hashCode()调用可能返回不同的值,这(当正确实现时)在以下意义上没有被破坏ObjectAPI 文档,但是当尝试从 API 检索已更改的实体时会导致问题Map, Set或其他基于哈希的Collection。因此,JPA 实现(至少是 EclipseLink)在某些情况下将无法正常工作。

更新2:

感谢您的回答——其中大多数都具有卓越的品质。
不幸的是,我仍然不确定哪种方法最适合实际应用程序,或者如何确定最适合我的应用程序的方法。因此,我将保持这个问题的开放性,并希望有更多的讨论和/或意见。


阅读这篇关于该主题的非常好的文章:不要让 Hibernate 窃取您的身份 https://web.archive.org/web/20171211235806/http://www.onjava.com/pub/a/onjava/2006/09/13/dont-let-hibernate-steal-your-identity.html.

文章的结论是这样的:

对象标识在以下情况下很难正确实现: 对象被持久化到数据库中。然而,问题源于 完全是因为允许对象在没有 id 的情况下存在 已保存。我们可以通过承担责任来解决这些问题 从对象关系映射框架中分配对象 ID 比如休眠。相反,对象 ID 可以在 对象被实例化。这使得对象标识变得简单并且 无错误,并减少领域模型中所需的代码量。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JPA hashCode() / equals() 困境 [关闭] 的相关文章

  • 帮助我了解 SEAM 和 Hibernate?

    我想将 SEAM Framework 与 Hibernate 一起使用 但不想使用 EJB 我无法使用 EJB 第一个问题是 我可以使用EntityManager吗 或者EntityManager是EJB的一部分 我如何才能在我的 SEAM
  • RSA Java 加密和 Node.js 解密不起作用

    我有一个系统 需要在 javascript 中生成 RSA 密钥对 然后将公钥存储在服务器端的数据库中 作为字符串 然后 Java 中的服务器端将使用存储的公钥对字符串进行加密密钥并将其发送到客户端 客户端将使用私钥解密该字符串 我在客户端
  • uniVocity 不会将第一列解析为 beans

    我试图在 uniVocity parsers 的帮助下从 GTFS zip 读取 CSV 文件 但遇到了一个我无法解决的问题 由于某种原因 某些 CSV 文件的第一列似乎无法正确解析 例如 在 stops txt 文件中 如下所示 stop
  • 使用 org.eclipse.xsd 和 Maven2 分析 XML 模式

    我正在尝试实现示例代码本文 http help eclipse org help32 index jsp topic org eclipse xsd doc references articles dwtip1 scpw index htm
  • HQL - 分页的行标识符

    有谁知道HQL是否有一个关键字来标识行 例如ROWID或ROWNUM 我想使用 HQL 实现分页 但我无法使用 setMaxResult 或 setFirstResult 因为我不直接使用会话对象 因此不使用 Query 对象 而只是将查询
  • Linux 上的 JavaFX

    Linux x86 和 x64 上的 JavaFX 情况如何 JavaFX 应用程序可以在 Linux 操作系统上顺利执行吗 我发现了 2011 年和 2012 年的一些问题 当时应用程序不稳定 目前发布的 JFX 版本是 2 2 4 在
  • Spring Data JPA 规范继承

    我有三个实体 如下所示 Entity Inheritance strategy InheritanceType JOINED DiscriminatorColumn name type public abstract class Emplo
  • Java写入ByteArrayOutputStream内存泄漏

    我正在将图像字节写入ByteArrayOutputStream然后通过套接字发送它 问题是 当我这样做时 ImageIO write image gif byteArray 内存增加很多 有点内存泄漏 我用这个发送 ImageIO writ
  • 自动装箱是否调用 valueOf()?

    我试图确定以下陈述是否保证为真 Boolean true Boolean TRUE Boolean true Boolean valueOf true Integer 1 Integer valueOf 1 我一直认为自动装箱相当于调用va
  • Apache HTTPClient SSLPeerUnverifiedException

    使用 Apache HttpClient 4 2 1 使用从基于表单的登录示例复制的代码 http hc apache org httpcomponents client ga examples html http hc apache or
  • Selenium 和 xpath:查找带有类/id 的 div 并验证其中的文本

    我正在努力拥有xpath find a div并验证div有一个特定的string里面的文字 这是HTML div class Caption Model saved div and div class gwt HTML sfnStanda
  • 识别包含本机方法实现的库文件/源

    如何识别包含本机方法实现的库文件 Ex public native String intern 我在哪里可以找到实施 source code of String intern 方法 找到了答案String intern 与快速谷歌搜索 ht
  • StringBuilder - 重置或创建新的

    我有一个条件 StringBuilder 不断存储与大型平面文件 数百 MB 中的模式匹配的行 但是 在达到条件后 我将 StringBuilder 变量的内容写入文本文件 现在我想知道是否应该通过重置对象来使用相同的变量 gt strin
  • 如何更新 Websphere 7 以使用 EL2.2?

    这就是我所做的 按照此林肯 巴克斯特的帖子 http ocpsoft com java jsf2 java jsf2 how to add the magic of el el2 to jsf 我下载了 el api 2 2 jar 和 e
  • 如何显示 javadoc 代码块中的泛型?

    我有一个 javadoc 代码块 我想在其中编写一个包含泛型的代码示例 如下所示 public interface SomeInterface
  • JRuby调用了错误的方法

    我在调用 Java 方法时遇到了一个奇怪的问题JRuby http en wikipedia org wiki JRuby 在我的 Java 类中 这些方法定义了两次 看来 JRuby 调用了错误的方法 所以我尝试使用java method
  • allure2 侦听器在控制台中输出步骤

    我正在使用 Allure2 和 TestNG 我想编写自己的侦听器 在控制台输出中打印 Steps 我在 allure 中看到了 StepLifecycleListener 接口 但我无法在 TestNg 中实现此侦听器 有什么指点吗 Ov
  • 如何处理JFreeChart中的SpiderWebPlot?

    发现 JFreeChart 我在使用时遇到了问题蜘蛛网情节 http www jfree org jfreechart api javadoc org jfree chart plot SpiderWebPlot html 这就是我今天所拥
  • 从 Java 程序中获取局部变量的名称和类型

    这是我正在尝试的代码 JavaCompiler compilerA ToolProvider getSystemJavaCompiler int resultA compilerA run null null null Users a Do
  • 从 google play 中提取统计信息

    我正在建立一些统计数据 并希望获得来自 google play 应用程序商店 的统计数据 最受欢迎 下载量 价格等信息 有谁知道是否有这个 API 或者我必须自己抓取它 有一个名为 android market api 的项目http co

随机推荐