在假定条件下,什么可以确切地识别.equals()方法:对象的实例或对象的状态?
我正在学习Hibernate和JPA。当我想使用双向OneToMany关联时,会出现问题,因为当我使用所有变量覆盖equal和HashCode方法时,它会变成无限循环。 解决我所看到的问题的唯一方法是,不要在equals()和hashCode()中使用另一个类实例。 因此,我正在考虑它是否与Java中的.equals()方法假设兼容。
例如,我们有一个Person类()。我知道电子邮件具有独特的价值。因此,我可以通过电子邮件比较人员,然后我知道它是同一个人(实例),但是我不知道对象的状态是否相同(firstName和lastName字段可以不同)。 所以这是我的问题,在使用.equals()比较对象期间,我们应该期待什么?
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String email="";
private String firstName = "";
private String lastName = "";
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Person)) return false;
Person person = (Person) o;
return email.equals(person.email);
}
@Override
public int hashCode() {
return Objects.hash(email);
}
}
答案 0 :(得分:1)
当我想到为给定的类实现equals
时,我会问自己一个问题:是什么使对象唯一?一个Person
与其他实例的区别是什么?然后,我使用该属性来实现equals
。对于您而言,或者在@Entity
个对象具有@XtoY
关系的情况下,我认为无需将此关系包括在equals
中。
例如,如果我有一个与Person
有关联的Department
,那么一个人属于某些部门的事实并不能使其与众不同。这是他的名字/姓氏/ PESEL或电子邮件等,这就是我要包含在equals
中的内容。
希望这会有所帮助。
答案 1 :(得分:0)
equals()的默认实现是:
public boolean equals(Object obj) {
return (this == obj);
}
因此,如果电子邮件相同,则覆盖的equals()将返回true。