【发布时间】:2023-03-25 19:55:02
【问题描述】:
我使用 Eclipse 通过选择感兴趣的字段/属性为我的 JPA 实体生成 hashcode() 和 equals() 方法。
但是,我观察到 Eclipse 似乎在生成的 equals 方法中添加了以下行:
if (getClass() != obj.getClass())
return false;
进行上述检查似乎是合乎逻辑的,但我在所有 JPA 实体中都使用 LAZY 加载的关系,并且我观察到,在某些情况下,当 obj 的类是某种代理类并且主要对象是有问题的实体 - 我检查了正在比较的对象类,两者并不完全相同,因此上述条件评估为 false,即使对象代表数据库中的相同记录。
因此,我的问题是当我们为 JPA 实体实现 equals() 方法时,我们是否应该比较对象的类。
【问题讨论】:
-
通常情况下,该检查用于防止
ClassCastException。代理类和主实体类是否都有一个共同的父级供您转换? -
我尝试将
Student类的实例与Student类实例的集合进行比较——第一个实例是从数据库中读取的,而集合是延迟初始化的,因为它是与另一个的子关系的一部分实体,比如College -
这并不能真正回答我的问题。您的代码可以在没有
if语句的情况下运行吗?如果是这样,您可以更加宽容,使用instanceof检查而不是比较getClass()。 -
我将不得不检查这一点 - 同时,其他人是否也应该面临这个问题,因为我不确定我是否通过使用延迟加载的实例来做任何不寻常的事情?
-
我认为你只能依赖
instanceof如果涉及代理并且你想要一个通用的Object.equals方法。对于同一类/类型的实体,Eclipse 方式必须有效