繁体   English   中英

JPA一对多关系持久性错误

[英]JPA One To Many Relationship Persistence Bug

我在jpa(休眠实现)中存在一个双向关系,这确实很奇怪。 一个用户基于一个区域,一个区域可以包含多个用户。

所以...关系如下:

区域对象:

@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);
}

问题是,当我运行一个小单元测试以将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());
}

因此,测试一直失败,说只有1个用户,而不是预期的5个。有什么想法我做错了吗?

非常感谢Brian

update(r)的实现是什么? 您还记得要提交吗?

哈希码的实现是什么,在User中等于? 也许您的所有用户在集合中都被认为是相同的,所以只有一个被保存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM