gpt4 book ai didi

java - JPA 实体 equals() 方法的正确实现方式

转载 作者:行者123 更新时间:2023-11-30 02:45:13 25 4
gpt4 key购买 nike

我通过选择感兴趣的字段/属性,使用 Eclipse 为我的 JPA 实体生成 hashcode()equals() 方法。

但是,我观察到 Eclipse 似乎在生成的 equals 方法中添加了以下几行:

    if (getClass() != obj.getClass())
return false;

进行上述检查似乎合乎逻辑,但我在所有 JPA 实体中使用 LAZY 加载关系,并且我观察到,在某些情况下,当 obj 的类是某些时,上述检查会失败代理类的类型,主要对象是相关实体的 - 我已经检查了正在比较的对象的类,两者并不完全相同,因此即使对象,上述条件也会评估为 false代表数据库中的相同记录。

因此,我的疑问是,当我们为 JPA 实体实现 equals() 方法时,我们是否应该比较对象的类。

最佳答案

建议对 JPA 实体使用业务键相等。自动生成的等于使用所有字段。

您的实体很可能拥有技术上自动生成的主键(id 字段)。在实体持久化后,该字段由数据库填充。如果您有自动生成的 equals/hashcode,它包括所有类字段 - 包括 id 字段。因此,实体的 equals/hashcode 将在持久化后发生变化,而不更改任何其他字段(持久化之前 id 将为空,持久化之后不为空)。

欲了解更多详情,请阅读 https://docs.jboss.org/hibernate/stable/core.old/reference/en/html/persistent-classes-equalshashcode.html

这是 Hibernate 引用,但与主键相关的所有概念都应适用于任何 JPA 提供程序。

关于java - JPA 实体 equals() 方法的正确实现方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40394399/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com