【发布时间】:2017-09-18 18:38:52
【问题描述】:
我有两个 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<User> members;
//getters/setters here
}
用户.java:
@Entity
@Table(name = "users")
public class User {
private int id;
private String email;
private Collection<Group> 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<Group> getGroups() {
return groups;
}
public void setGroups(Collection<Group> 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;
}
}
我尝试为具有一个成员的组运行以下 sn-p,其中 group 是刚从 JpaRepository 检索到的实体,user 是该组的成员和分离的实体。
Collection<User> 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() 的正确方法是什么?
【问题讨论】:
-
您声明 Hibernate 集合中的用户有空字段。哪些字段为空?电子邮件字段?通过迭代器获取用户后它仍然为空吗?如果 Group 对其成员集合使用延迟加载(我相信这是 @ManyToMany 的默认行为),它可能会加载一些代理或仅填充主键的对象,只有在您对集合执行访问时才会获取其他字段。
标签: java hibernate jpa collections contains