可嵌入的JPA类应该实现equals和hashCode吗?

10

假设我有以下场景:

@Entity
public class Person {
    @Id
    private Long id; //Surrogate key

    @Embedded
    private Name name; //Natural key

    public int hashCode() {
        ... //based on natural key Name
    }
    public boolean equals(Object obj) {
        ... //based on natural key Name
    }
}

@Embeddable
public class Name {
    private String firstName;
    private String middleName;
    private String lastName;

    //Should I implement equals/hashCode baseed on the three fields?
}

在Person equals正常工作的情况下,Name类是否应该实现equals和hashCode?

对于将用作EmbeddedId的可嵌入对象,这是必须的。但在此示例中,我正在使用代理键。


你确定“name”会真正唯一吗?很容易想象出两个人有相同的名字的情况。 - matt b
1
这只是一个例子,不是真实的情况。 - Alfredo Osorio
只是提醒一下...你的Person类不是final。你应该意识到,如果你扩展Person,你的equals方法就会失效,因为正如Joshua Bloch在《Effective Java》中所说:没有办法在保留等式合同的同时扩展一个可实例化的类。我不知道《Effective Java》是什么时候出版的(2001年?),但我相信总有一天人们会承认,在Java面向对象层次结构的顶部拥有*equals()hashCode()*是Gosling最大的脑抽之一 ;) [这个面向对象问题在那之前就已经被知晓了,但《Effective Java》往往是权威的] - SyntaxT3rr0r
3
根据 JPA 规范,实体类不能是 final 类。 - Alfredo Osorio
1个回答

6

我认为JPA从来没有要求你实现equals和hashcode。Hibernate以前是需要的,但最近文档的审核显示这不再是必须的。

当然,实现hashcode和equals总是一个好主意。


Embeddable类和Entity类都应该实现equals和hashCode方法吗?最终的答案是什么? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接