Java 可嵌入jpa类是否应该实现equals和hashCode?

Java 可嵌入jpa类是否应该实现equals和hashCode?,java,jpa,persistence,Java,Jpa,Persistence,假设我有以下场景: @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)

假设我有以下场景:

@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 class是否应该在Name class上实现equals和hashCode


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

我认为JPA从未要求您实现equals和hashcode。Hibernate过去是,但最近对文档的审查表明,这不再是一项要求


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

你确定“名字”真的是独一无二的吗?不难想象两个人同名的情况。这只是一个例子。不是真的,只是一张纸条。。。你的个人课不是期末考试。您应该意识到,如果您扩展Person,您的equals将被破坏,因为正如Joshua Bloch在“有效Java”中所说的那样:在保留equals契约的同时,根本无法扩展可实例化类。我不知道“有效的Java”是什么时候出现的(2001年?),但我相信有一天人们会承认,在Java OO层次结构的顶端有equals()和hashCode()是高斯林最大的脑残;)[在此之前,OO问题是已知的,但有效的Java往往是权威的]根据JPA规范,实体类不能是最终的。