Jpa Netbeans是否正确地创建了“equals”方法?

Jpa Netbeans是否正确地创建了“equals”方法?,jpa,netbeans,hashcode,Jpa,Netbeans,Hashcode,从数据库创建实体时,Netbeans将创建equals方法: 并根据以下内容返回报表: ~A∧ ~C∨ ~A.∧ ~B→ ~A.∨ C∧ A.∨ B→ C∨ B 等于: (other.id == null) || (this.id.equals(other.id)) 一,。这是正确的还是我应该将其更改为: (this.id != null) && (this.id.equals(other.id)) 二,。我应该在hashCode方法中使用像10这样的数字,而不是自动递

从数据库创建实体时,Netbeans将创建equals方法:

并根据以下内容返回报表:

~A∧ ~C∨ ~A.∧ ~B→ ~A.∨ C∧ A.∨ B→ C∨ B

等于:

(other.id == null) || (this.id.equals(other.id))
一,。这是正确的还是我应该将其更改为:

(this.id != null) && (this.id.equals(other.id))
二,。我应该在hashCode方法中使用像10这样的数字,而不是自动递增id吗


三,。自然Id或业务Id是完全不可变的还是可以更改的。我的意思是,我应该为它定义一个setter方法吗?

[UPDATE]Netbeans正确地创建了该方法,正如您所看到的那样!在比较中,这就是为什么他使用OR和!内部相等:

return !(
         (this.id == null && other.id != null) ||
         (this.id != null && !this.id.equals(other.id))
       );
因此,按照Objects.equals的实现,从1.7开始,这将是最好的:

(this.id != null) && (this.id.equals(other.id))
与equals和hashCode的代码不同,您可以:

import java.util.Objects;

@Override
public boolean equals(Object object) {
    if (this == object) return true;
    if (object == null || getClass() != object.getClass()) return false;
    Department department = (Department) object;
    return Objects.equals(id, department.id);
}

@Override
public int hashCode() {
    return Objects.hash(id);
}
下面是Objects.hash最终调用的实现:

public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;

    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}
关于hashCode方法,最好使用与equals中相同的字段。 在这里,尝试使用将实体标识为实体的字段,例如:

如果字段名是唯一的,请使用该名称。 字段名和编号是唯一的,然后同时使用。 创建对象后,不应该为Id字段设置setter。您可以有一个构造函数,在这里您可以接收它,而不是在单元测试中使用它,但不能使用setter。不可变对象是一种很好的方法,但如果不能,至少标识实例的字段不应该更改


希望我能帮忙。

谢谢你,兄弟!netbeans是否正确创建了该方法?你能解释一下你的hashCode方法吗。这与我在互联网上看到的完全不同,为什么这是静态的?假设,我在住宿项目中有一个舒适实体,它有一个名为name的持久字段。我应该将其用于哈希代码吗?那个么服务实体中的持久字段名呢?我的意思是,我可以为它们使用@naturaid,为hashCode使用它们吗?嗨@Arash,首先:是的,netbeans正确地创建了这个方法。我更新了我的答案,解释了原因。我的hashcode方法不是静态的,Objects.hash在其中调用的方法是java.util.Arrays.hashcode。关于HashCode和Equals中使用的字段,请尝试使用将实体标识为唯一的字段,如果名称是唯一的,那么名称是唯一的,如果名称+另一个字段是唯一的,请同时使用这两个字段,等等。感谢您的关注,兄弟。假设name字段是唯一的,但可能很少更改。在hashCode中使用它作为自然值可以吗?为什么不应该使用这样的东西:返回id!=无效的id.hashCode:0;?什么是31?为什么不是30或其他数字?如何得到这个计算语句:31*result+element==null?0:元素。哈希代码;?为什么要使用if==对象返回true;我们用equals方法比较这两个,对吗?Hi@Arash,这段代码和幻数31来自Java库,它是一个素数,这就是为什么使用它。关于if this==对象返回true;它用于比较内存中的引用,例如:如果有两个变量指向内存中的同一对象,它将返回true,而不需要深入比较id、name或类。
public static int hashCode(Object a[]) {
    if (a == null)
        return 0;

    int result = 1;

    for (Object element : a)
        result = 31 * result + (element == null ? 0 : element.hashCode());

    return result;
}