Лучшая реализация equals
и hashCode
- это использование уникального бизнес-ключа или естественного идентификатора, например:
@Entity
public class Company {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(unique = true, updatable = false)
private String name;
@Override
public int hashCode() {
HashCodeBuilder hcb = new HashCodeBuilder();
hcb.append(name);
return hcb.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (!(obj instanceof Company)) {
return false;
}
Company that = (Company) obj;
EqualsBuilder eb = new EqualsBuilder();
eb.append(name, that.name);
return eb.isEquals();
}
}
Бизнес-ключ должен быть согласованным для всех переходов состояния объекта (временное, присоединенное, отсоединенное, удаленное), поэтому вы не можете полагаться на идентификатор для равенства.
Другой вариант - перейти на использование идентификаторов UUID, назначаемых логикой приложения. Таким образом, вы можете использовать UUID для _4 _ / _ 5_, потому что идентификатор назначается до того, как объект будет сброшен.
Вы даже можете использовать идентификатор объекта для equals
и hashCode
, но это требует, чтобы вы всегда возвращали одно и то же значение [hashCode
, чтобы убедиться, что значение hashCode объекта согласовано при всех переходах состояния объекта, например:
@Entity(name = "Post")
@Table(name = "post")
public class Post implements Identifiable<Long> {
@Id
@GeneratedValue
private Long id;
private String title;
public Post() {}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Post))
return false;
Post other = (Post) o;
return id != null &&
id.equals(other.getId());
}
@Override
public int hashCode() {
return getClass().hashCode();
}
//Getters and setters omitted for brevity
}
person
Vlad Mihalcea
schedule
27.06.2014