Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.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 继承类中的Equal和hashcode_Java_Jpa - Fatal编程技术网

Java 继承类中的Equal和hashcode

Java 继承类中的Equal和hashcode,java,jpa,Java,Jpa,根据我的理解,下面的equal和hashcode实现是安全的,因为派生类中的正确方法将调用(而不是父类),即使我通过父指针调用它。前提是父类被视为抽象类(在JPA-Hibernate基类中使用)。请根据以下示例确认此假设 @Entity @Inheritance class A { String type; } @Entity class B extends A { String uniqueName; ....... @Override public boolean equals(

根据我的理解,下面的equal和hashcode实现是安全的,因为派生类中的正确方法将调用(而不是父类),即使我通过父指针调用它。前提是父类被视为抽象类(在JPA-Hibernate基类中使用)。请根据以下示例确认此假设

@Entity
@Inheritance
class A {
String type;
}

@Entity
class B extends A {
String uniqueName;
.......

@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

@Entity
class C extends A {
String uniqueName;
.......
@Override
    public boolean equals(Object obj) {
..
}
@Override
    public int hashCode() {
}
}

class D {
A a;
String name;
}
由于A可以同时接受B和C的实例,因此在为D编写equal/hash方法时,上面的实现是否可以(仅在B&C中,而不是在A中)。不会有直接实例化a(新a)的情况


谢谢。

您是否在即时超类未实现的派生类中编写hashcode和equals方法


如果你说类A永远不会被直接实例化,为什么不声明一个抽象,那么就没有问题了。

我认为你的示例代码不完整,因为我怀疑你在问如果
d.equals()
方法使用
A.equals()
,那么调用
equals()
方法的哪个版本

如果这就是你要问的,那么答案将是
a
类型的
equals()
方法。如果
a
是a
B
,则将调用
B.equals()
。如果
a
C
,则调用
C.equals()
。无论
A
是否有自己的
equals()
方法实现,这都是正确的

既然您提到了Hibernate,我想您正在尝试创建一个连接的子类映射或类似的映射。如果映射正确,那么Hibernate不会尝试直接实例化
A
,这实际上应该是抽象的,因为您就是这样描述它的

根据我的理解,以下是 equal和hashcode的实现 是安全的,因为在 派生类将调用(而不是 家长),即使我通过 父指针


你是在要求多态性吗?如果执行:是,调用哪个方法取决于运行时类型,而不是引用的类型。只要对象是B或C类型,一切都很好。

哪种实现?您只是发布了声明,而不是方法体。使用IDE生成的代码。Tom,谢谢。。是的,这是我的问题。。不是关于实施。。。我不确定JPA是如何处理抽象类的。。快速搜索还显示了一些指定鉴别器列的示例。。我会读更多..@bsreekanth,当你没有特别重写A中的equals时,equals()和hashCode()是从Object继承的。谢谢。。对不起,我的问题不清楚,但你猜对了:-)