我有两个JPA实体类,Group和User
Group.java:
@Entity
@Table(name = "groups")
public class Group {
@Id
@GeneratedValue
private int id;
@ManyToMany
@JoinTable(name = "groups_members", joinColumns = {
@JoinColumn(name = "group_id", referencedColumnName = "id")
}, inverseJoinColumns = {
@JoinColumn(name = "user_id", referencedColumnName = "id")
})
private Collection members;
//getters/setters here
}
User.java:
@Entity
@Table(name = "users")
public class User {
private int id;
private String email;
private Collection groups;
public User() {}
@Id
@GeneratedValue
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
@Column(name = "email", unique = true, nullable = false)
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "groups_members", joinColumns = {
@JoinColumn(name = "user_id")
}, inverseJoinColumns = {@JoinColumn(name = "group_id")})
public Collection getGroups() {
return groups;
}
public void setGroups(Collection groups) {
this.groups = groups;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof User)) return false;
User user = (User) o;
if (id != user.id) return false;
return email.equals(user.email);
}
@Override
public int hashCode() {
int result = id;
result = 31 * result + email.hashCode();
return result;
}
}
我尝试为具有一个成员的组运行以下代码段,其中group是刚从JpaRepository检索的实体,user是该组和分离实体的成员.
Collection members = group.getMembers();
System.out.println(members.contains(user)); //false
User user1 = members.iterator().next();
System.out.println(user1.equals(user)); //true
经过一些调试后,我发现在.contains()调用期间调用了User.equals(),但是Hibernate集合中的用户有空字段,因此.equals()被评估为false.
那么为什么它如此奇怪以及在这里调用.contains()的正确方法是什么?