Java 在递归对象上实现equals和hashCode(JPA@manytomy)

Java 在递归对象上实现equals和hashCode(JPA@manytomy),java,hibernate,jpa,recursion,comparison,Java,Hibernate,Jpa,Recursion,Comparison,我最近使用双向映射实现了一些JPA实体,如下面的示例所示 public class User { @ManyToMany(...) private List<Group> groups; // ... } public class Group { @ManyToMany(...) private List<User> users; // ... } 显然,这将以一个StackOverflowError结束,因为如果用

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

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

    // ...
}

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

    // ...
}
显然,这将以一个
StackOverflowError
结束,因为如果用户被分配到一个组,那么
equals(objectobj)
被称为无限次

对于这种情况是否有最佳实践,或者我是否应该将这些集合从
equals(objectobj)
中排除


感谢您的帮助:)

在我看来,最好的做法是通过比较两个实体的唯一ID来比较它们。用户不会通过输入新组而成为不同的用户。更不用说,通过改变她所属的一个团体


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

大问题,+1;这很有趣!我要问自己的一件事是,将这些实体中的每一个实体与另一个实体进行比较是否真的有意义。例如,两个具有相同ID/用户名(假设您有某种唯一的密钥)但关联组列表不同的用户能否共存?如果不是,那么为什么把清单看作是<代码>的一部分等于< /代码>?类似地,对于组,您希望组具有某种唯一的ID(例如,名称),那么,当您可以比较ID时,为什么还要比较用户集呢?我也想过比较他们的ID。我也喜欢把“外包”的想法具体比较一下。
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);

        // ...
    }
}