Eclipse默认equals()实现的问题

时间:2019-04-30 05:10:43

标签: java eclipse jpa

我在Eclipse生成的equals方法上遇到了一些问题。

假设我有一个实体Bean,其属性为entityIdname,但是我只是选择了entityId属性来生成相等项。因此,eclipse生成的代码如下:

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Entity other = (Entity) obj;
        if (entityId == null) {
            if (other.entityId != null)
                return false;
        } else if (!entityId.equals(other.entityId))
            return false;
        return true;
    }

问题是,当比较类Entity的两个不同实例并将null作为entityId时,equals方法返回true。

对我来说,这种equals实现是不正确的(至少在与JPA一起使用时),因为没有entityId的两个实体只是要(可能)保留为新对象的对象数据库中的对象。如果我将这两个对象添加到Set中(例如一对多关系),则在两次插入之后,Set中将只有一个元素(Set不允许重复)。

所以,问题是为什么Eclipse会生成这样的equals方法?您认为使用以下代码实现equals方法更好吗?

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        Entity other = (Entity) obj;
        if (entityId == null) {
            if (other.entityId != null)
                return false;
            else 
                return true;
        } else if (!entityId.equals(other.entityId))
            return false;
        return true;
    }

1 个答案:

答案 0 :(得分:2)

Eclipse根本不知道如何使用您的类。

通常,如果字段具有相等的值,则对象被视为相等

class Human {
    String name;
    String petName;
}

Human("Bob", null)等于Human("Bob", null)

您的情况有些特殊,因此您必须自己进行调整。