我已经使用Eclipse通过选择感兴趣的字段/属性为我的JPA实体生成hashcode()
和equals()
方法。
但是,我观察到Eclipse似乎在生成的equals
方法中添加了以下行:
if (getClass() != obj.getClass())
return false;
进行上述检查似乎合乎逻辑,但我在所有JPA实体中使用了LAZY加载的关系,并且我观察到在某些情况下,当obj
的类是某些时,检查失败一类代理类,主要对象是有问题的实体 - 我检查了被比较的对象类,两者不完全相同,因此上述条件评估为false
,即使对象表示相同的记录来自数据库。
因此,在我们为JPA实体实现equals()
方法时,我们应该比较对象类。
答案 0 :(得分:2)
建议对JPA实体使用业务密钥相等。 Autogenerated equals使用所有字段。
您的实体很可能具有技术自动生成的主键(ID字段)。实体持久化后,该字段由数据库填充。 如果您有自动生成的equals / hashcode,则它包含所有类字段 - 包括该id字段。 因此,在持久化之后,实体的equals / hashcode将发生更改,而不会更改任何其他字段(在persist not null之后,persist id将为null)。
这是Hibernate参考,但与主键相关的所有概念都应该适用于任何JPA提供程序。