重写持久实体的哈希码 () 和等于 () 方法的正确方法是什么?
我有一个简单的类角色:
@Entity
@Table (name = "ROLE")
public class Role implements Serializable {
@Id
@GeneratedValue
private Integer id;
@Column
private String roleName;
public Role () { }
public Role (String roleName) {
this.roleName = roleName;
}
public void setId (Integer id) {
this.id = id;
}
public Integer getId () {
return id;
}
public void setRoleName (String roleName) {
this.roleName = roleName;
}
public String getRoleName () {
return roleName;
}
}
现在我想覆盖它的方法等于和哈希码。我的第一个建议是:
public boolean equals (Object obj) {
if (obj instanceof Role) {
return ((Role)obj).getRoleName ().equals (roleName);
}
return false;
}
public int hashCode () {
return id;
}
但是当我创建新的角色对象时,它的 id 是 null。这就是为什么我在hashCode方法实现方面有一些问题。现在我可以简单地返回,但是如果角色名称不是必需字段怎么办?我几乎可以肯定,编造更复杂的例子并不难,这些例子无法通过返回其中一个字段的哈希代码来解决。roleName.hashCode ()
因此,我希望看到一些相关讨论的链接,或者听听您解决此问题的经验。谢谢!