JPA Ошибка постоянства отношений один ко многим - PullRequest
0 голосов
/ 22 марта 2010

У меня действительно странная проблема с двунаправленными отношениями в 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);
}

Проблема в том, что когда я запускаю небольшой модульный тест для добавления 5 пользователей к моему объекту региона, я вижу, что набор region.getUsers () всегда остается на одном объекте ... каким-то образом набор не добавляется к.

Код моего модульного теста выглядит следующим образом:

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

Ответы [ 2 ]

0 голосов
/ 23 марта 2010

Какая реализация хэш-кода и равно в User? Возможно, все ваши пользователи считаются одинаковыми в наборе, поэтому только один из них будет сохранен.

0 голосов
/ 22 марта 2010

Что такое реализация для update(r)?Вы помните, чтобы совершить?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...