Java中.equals()方法的假设-比较对象的实例或对象的状态

时间:2019-07-25 09:48:25

标签: java hibernate spring-data-jpa

在假定条件下,什么可以确切地识别.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);
    }
}

2 个答案:

答案 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。