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规范,实体类不能是最终的。