JPA一对多关系持久性错误

时间:2010-03-22 13:48:03

标签: java hibernate jpa

我在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.任何想法我做错了什么?

非常感谢, 布赖恩

2 个答案:

答案 0 :(得分:0)

update(r)的实施方式是什么?你还记得提交吗?

答案 1 :(得分:0)

用户中hashcode和equals的实现是什么?也许所有用户在Set中都被认为是相同的,因此只有一个用户被保存。