Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java中.equals()方法的假设-比较对象';s实例或对象';s州_Java_Hibernate_Spring Data Jpa - Fatal编程技术网

java中.equals()方法的假设-比较对象';s实例或对象';s州

java中.equals()方法的假设-比较对象';s实例或对象';s州,java,hibernate,spring-data-jpa,Java,Hibernate,Spring Data Jpa,假设中的.equals()方法是什么:对象的实例还是对象的状态 我正在学习Hibernate和JPA。当我想使用双向一元多变量关联时,会出现一个问题,因为当我用所有变量重写equal和HashCode方法时,就会出现无穷循环。 解决我所看到的问题的唯一方法是不在一个类中使用equals()和hashCode()中的另一个类实例。 所以我在考虑它是否与Java for.equals()方法中的假设兼容 例如,我们有一个Person类()。我知道电子邮件具有独特的价值。所以我可以通过电子邮件比较pe

假设中的.equals()方法是什么:对象的实例还是对象的状态

我正在学习Hibernate和JPA。当我想使用双向一元多变量关联时,会出现一个问题,因为当我用所有变量重写equal和HashCode方法时,就会出现无穷循环。 解决我所看到的问题的唯一方法是不在一个类中使用equals()和hashCode()中的另一个类实例。 所以我在考虑它是否与Java for.equals()方法中的假设兼容

例如,我们有一个Person类()。我知道电子邮件具有独特的价值。所以我可以通过电子邮件比较person,然后我知道它是同一个人(实例),但我不知道对象的状态是否相同(firstName和lastName字段可能不同)。 所以我的问题是,在将object与.equals()进行比较时,我们应该期待什么


equals()的默认实现是:


因此,如果电子邮件相同,则重写的equals()将返回true。

当我想到为给定类实现
equals
时,我问自己一个问题:是什么使对象唯一?一个人的实例与另一个人的实例有什么不同?然后我使用该属性实现
等于
。在您的情况下,或者在具有
@XtoY
关系的
@Entity
对象的情况下,我认为没有必要将此关系包含到
equals

例如,如果我有一个
,他与
部门
有关系,那么一个人属于某些部门的事实并不能使他成为唯一的人。是他的名字/姓氏/佩塞尔或电子邮件等等,这就是我将在
equals
中包含的内容


希望这有帮助。

From Object.equals doc:“@return{@code true}如果这个对象与obj参数相同;{@code false}否则。”嗨!在提问之前,我已经在文档中阅读了它,但它意味着对象是相同的吗?例如,我们无法获取正在考虑的id值,因为它是由数据库生成的,只要我们不将对象保存到数据库中,它就为null。JPA中的EntityMappings不使用实体id吗?他们真的需要实现
equals
吗?JPA在没有它的情况下可以正常工作,但我需要它是因为其他原因,我想确保我没有打破任何Java概念来避免框架工作中的错误。是的,但是跳过firstName和lastName是正确的吗?我这样问是因为这个方法可以用来比较对象,我们知道equal()只定义同一个对象的实例,然后我们知道如果我们想确保对象的状态是相同的,我们需要比较字段。但是,如果在假设中,只有当状态相同时,该方法才会返回true,那么我们就不需要比较字段。你有一个有效的观点:这可能会帮助你:谢谢,我以前读过它,但在那里他只使用自然键来比较对象,但我不确定它是否正确。
@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);
    }
}
public boolean equals(Object obj) {
        return (this == obj);
    }