我在jpa(hibernate实现)中遇到了一个非常奇怪的双向关系问题。用户位于一个区域,区域可以包含许多用户。
所以......关系如下:
区域对象:
@OneToMany(mappedBy = "region", fetch = FetchType.LAZY, cascade = CascadeType.ALL)
public Set<User> getUsers() {
return users;
}
public void setUsers(Set<User> users) {
this.users = users;
}
用户对象:
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.MERGE}, fetch = FetchType.EAGER)
@JoinColumn(name = "region_fk")
public Region getRegion() {
return region;
}
public void setRegion(Region region) {
this.region = region;
}
所以,你在上面看到的关系是区域方面的懒惰,即我不希望该区域急于加载所有用户。因此,我在DAO层中有以下代码,用于将现有用户的用户添加到现有区域对象...
public User setRegionForUser(String username, Long regionId){
Region r = (Region) this.get(Region.class, regionId);
User u = (User) this.get(User.class, username);
u.setRegion(r);
Set<User> users = r.getUsers();
users.add(u);
System.out.println("The number of users in the set is: "+users.size());
r.setUsers(users);
this.update(r);
return (User)this.update(u);
}
问题是,当我运行一个小单元测试以向我的region对象添加5个用户时,我看到region.getUsers()设置总是停留在1个对象...不知何故该集合没有被添加到。
我的单元测试代码如下:
public void setUp(){
System.out.println("calling setup method");
Region r = (Region)ManagerFactory.getCountryAndRegionManager().get(Region.class, Long.valueOf("2"));
for(int i = 0; i<loop; i++){
User u = new User();
u.setUsername("username_"+i);
ManagerFactory.getUserManager().update(u);
ManagerFactory.getUserManager().setRegionForUser("username_"+i, Long.valueOf("2"));
}
}
public void tearDown(){
System.out.println("calling teardown method");
for(int i = 0; i<loop; i++){
ManagerFactory.getUserManager().deleteUser("username_"+i);
}
}
public void testGetUsersForRegion(){
Set<User> totalUsers = ManagerFactory.getCountryAndRegionManager().getUsersInRegion(Long.valueOf("2"));
System.out.println("Expecting 5, got: "+totalUsers.size());
this.assertEquals(5, totalUsers.size());
}
所以测试一直没说,只有一个用户而不是预期的5.任何想法我做错了什么?
非常感谢, 布赖恩
答案 0 :(得分:0)
update(r)
的实施方式是什么?你还记得提交吗?
答案 1 :(得分:0)
用户中hashcode和equals的实现是什么?也许所有用户在Set中都被认为是相同的,因此只有一个用户被保存。