【发布时间】:2011-06-13 08:25:30
【问题描述】:
假设我有以下场景:
@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?
}
Name 类是否应该在 Name 类上实现 equals 和 hashCode 以使 Person equals 正常工作?
对于将用作 EmbeddedId 的 Embeddable 对象是必须的。但在本例中,我使用的是代理键。
【问题讨论】:
-
你确定“名字”真的是独一无二的吗?不难想象两个人同名的情况。
-
这只是一个例子。不是真实的场景。
-
请注意...您的 Person 类不是 final。你应该意识到,如果你扩展 Person 你的 equals 会被破坏,因为正如 Joshua Bloch 在 "Effective Java" 中所说的那样:那里根本无法在保留 equals 合同的同时扩展可实例化的类。我不知道 "Effective Java" 什么时候问世(2001 年?),但我相信有一天人们会承认有 equals() 和 Java OO 层次结构顶部的 hashCode() 是 Gosling 最大的大脑放屁之一 ;) [在此之前就知道 OO 问题,但 Effective Java 往往是权威的]跨度>
-
根据 JPA 规范,实体类不能是最终的。
标签: java jpa persistence