什么问题/陷阱,必须重写时,必须考虑equals和hashCode?
我有一个名为User的域对象.用户的属性包括ssoId,name,email,createdBy,createdDate和userRole.其中,ssoId必须是唯一的,因为没有两个用户可以拥有相同的sso id.所以我的equals方法检查sso id并返回true或false.
@Override public boolean equals(Object o) {
if (!(o instanceof User))
return false;
return user.getSsoId().equals((User)o.getSsoId());
}
Run Code Online (Sandbox Code Playgroud)
我觉得这是一个不正确的实现,尽管就业务规则而言是正确的.对于具有相同sso id但具有不同的名称或电子邮件或两者的值的两个对象,上述实现将返回true.我应该更改我的平等合同以检查所有字段的相等性吗?你的建议是什么?
我有一个BaseEntity类,它是我的应用程序中所有JPA实体的超类.
@MappedSuperclass
public abstract class BaseEntity implements Serializable {
private static final long serialVersionUID = -3307436748176180347L;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "ID", nullable=false, updatable=false)
protected long id;
@Version
@Column(name="VERSION", nullable=false, updatable=false, unique=false)
protected long version;
}
Run Code Online (Sandbox Code Playgroud)
每个JPA实体都延伸BaseEntity并继承id和version属性BaseEntity.
这里实施equals()和hashCode()方法的最佳方法是BaseEntity什么?BaseEntity将继承equals()和hashCode()行为形式的每个子类BaseEntity.
我想做这样的事情:
public boolean equals(Object other){
if (other instanceof this.getClass()){ //this.getClass() gives class object but instanceof operator expect …Run Code Online (Sandbox Code Playgroud) 在第4.3章的Hibernate文档中." 实现equals()和hashCode() "他们写了这句话:
"此外,如果一个实例未保存并且当前在一个Set中,保存它将为该对象分配一个标识符值.如果equals()和hashCode()基于标识符值,则哈希码将改变,违反合同集."
我不明白它打破了什么合同以及可以从中获得什么问题.