equals()中的getClass()为我的实体提供了意外的结果

时间:2018-04-05 15:11:44

标签: java hibernate spring-data-jpa

我有一种分离两个物体的方法 在方法的开头,我从DB(SpringData JPA / HIBERNATE)检索两个对象,我们将其命名为类型A的object1和类型B的object2,然后我比较object1.getB().equals(object2)和{{1} }与object1.getB相同,结果为object2。为什么?如果我调试方法,我可以看到object2和对象2的属性B具有相同的类false。为什么有这个奇怪的名字?不应该只是B?在比较时B_$$_jvst1a4_5方法infact

equals

我获得if (getClass() != obj.getClass()) return false; ,因此返回false。

有人能解释我这种行为吗?

1 个答案:

答案 0 :(得分:2)

您使用在运行时生成类的库(代理类)。 你永远不应该依赖getClass()这些代理类来比较两个实例的类,因为你没有手,并保证Hibernate(这里)和Spring(当你使用它)如何生成它们。
作为equals()的备选方案,您应该使用instanceof运算符来确定对象是否是编译时已知的类的实例:

if (myObject instanceof MyClass){
   ...
}

无论如何,在instanceof实现中应始终优先考虑equals(),以免破坏子类实例的方法行为。