递归对象(JPA @ManyToMany)上实现equals和hashCode

时间:2018-08-05 21:37:35

标签: java hibernate jpa recursion comparison

我最近使用双向映射实现了一些JPA实体,如以下示例所示。

public class User {
    @ManyToMany(...)
    private List<Group> groups;

    // ...
}

public class Group {
    @ManyToMany(...)
    private List<User> users;

    // ...
}

我还在这两个类上实现了equals(Object)hashCode(),包括对这些实体中的每个实体分别为其所分配的组和所分配的用户进行了比较。

public class User {
    public boolean equals(Object obj) {
        // ...

        Objects.equals(this.groups, obj.groups);

        // ...
    }
}

public class Group {
    public boolean equals(Object obj) {
        // ...

        Objects.equals(this.users, obj.users);

        // ...
    }
}

很显然,这将以StackOverflowError结尾,因为如果将用户分配给组,则equals(Object obj)被无限次调用。

在这种情况下是否有最佳实践?还是应该将这些集合排除在equals(Object obj)之外?

感谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

我认为,最佳做法是通过比较两个实体的唯一ID来比较它们。通过输入新的组,用户不会成为其他用户。通过更改她所属的组之一,更不用说了。

特定领域的比较可能多种多样,应该在单独的比较器中实现。