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

时间:2016-11-03 05:25:08

标签: java hibernate jpa

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

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

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

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

因此,在我们为JPA实体实现equals()方法时,我们应该比较对象类。

1 个答案:

答案 0 :(得分:2)

建议对JPA实体使用业务密钥相等。 Autogenerated equals使用所有字段。

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

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

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