Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java equals()中的getClass()为我的实体提供了意外的结果_Java_Hibernate_Spring Data Jpa - Fatal编程技术网

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

Java equals()中的getClass()为我的实体提供了意外的结果,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,我有一个分离两个对象的方法。 在方法开始时,我从DB(SpringData JPA/HIBERNATE)检索两个对象,即我们称为类型A的object1和类型B的object2,然后比较object1.getB().equals(object2),尽管object1.getB与object2相同,但结果是false。为什么?如果调试该方法,我可以看到object2和object2的属性B具有相同的类,即B_$$\u jvst1a4_5。为什么有这个奇怪的名字?不应该只有B吗?在等于方法中,比较时生

我有一个分离两个对象的方法。
在方法开始时,我从DB(SpringData JPA/HIBERNATE)检索两个对象,即我们称为类型A的object1和类型B的object2,然后比较
object1.getB().equals(object2)
,尽管
object1.getB
object2
相同,但结果是
false
。为什么?如果调试该方法,我可以看到object2和object2的属性B具有相同的类,即
B_$$\u jvst1a4_5
。为什么有这个奇怪的名字?不应该只有B吗?在
等于
方法中,比较时生效

if (getClass() != obj.getClass())
    return false;
我获得
B!=B_$$\u jvst1a4_5
,因此返回false


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

您使用在运行时生成类的库(代理类)。 您永远不应该依赖这些代理类的
getClass()
来比较两个实例的类,因为您无法掌握和保证Hibernate(此处)和Spring(使用时)如何生成它们。
作为
equals()
的替代方法,您应该使用
instanceof
操作符来确定对象是否是编译时已知的类的实例:

if (myObject instanceof MyClass){
   ...
}
无论如何,
instanceof
equals()
实现中应该始终受到青睐,以免破坏子类实例的方法行为