java中.equals()方法的假设-比较对象';s实例或对象';s州
假设中的.equals()方法是什么:对象的实例还是对象的状态 我正在学习Hibernate和JPA。当我想使用双向一元多变量关联时,会出现一个问题,因为当我用所有变量重写equal和HashCode方法时,就会出现无穷循环。 解决我所看到的问题的唯一方法是不在一个类中使用equals()和hashCode()中的另一个类实例。 所以我在考虑它是否与Java for.equals()方法中的假设兼容 例如,我们有一个Person类()。我知道电子邮件具有独特的价值。所以我可以通过电子邮件比较person,然后我知道它是同一个人(实例),但我不知道对象的状态是否相同(firstName和lastName字段可能不同)。 所以我的问题是,在将object与.equals()进行比较时,我们应该期待什么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()的默认实现是:
因此,如果电子邮件相同,则重写的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);
}