Java 在递归对象上实现equals和hashCode(JPA@manytomy)
我最近使用双向映射实现了一些JPA实体,如下面的示例所示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结束,因为如果用
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);
// ...
}
}