2010-03-22 6 views
0

J'ai un problème vraiment étrange avec une relation bidirectionnelle dans jpa (mise en œuvre d'hibernation). Un utilisateur est basé dans une région et une région peut contenir plusieurs utilisateurs.JPA One To Many Relations Persistance Bogue

Alors ... relation est la suivante:

objet Région:

@OneToMany(mappedBy = "region", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 
public Set<User> getUsers() { 
    return users; 
} 
public void setUsers(Set<User> users) { 
    this.users = users; 
} 

objet Utilisateur:

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

Ainsi, la relation que vous pouvez voir ci-dessus est paresseux sur la côté région, c'est-à-dire, je ne veux pas que la région souhaite charger tous les utilisateurs. Par conséquent, j'ai le code suivant dans ma couche DAO pour ajouter un utilisateur à un utilisateur existant à un objet région existante ...

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

Le problème est, quand je lance un petit test de l'unité d'ajouter 5 utilisateurs à mon objet région, je vois que l'ensemble region.getUsers() reste toujours bloqué sur 1 objet ... d'une certaine manière l'ensemble ne s'y ajoute pas.

Mon code de test unitaire est comme suit:

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

Donc, le test échoue après dire il n'y a que 1 utilisateur au lieu des attendus 5. Toutes les idées que je fais mal?

merci beaucoup, Brian

Répondre

0

Quelle est la mise en œuvre update(r)? Vous souvenez-vous de vous engager?

+0

À l'heure actuelle, la mise à jour effectue les opérations suivantes: public Object update(Object o) { Object a = this.entityManager.merge(o); this.entityManager.flush(); return a; } Brian

+0

jeter un entityManager.getTransaction() commit();. là à la fin et vous devriez être mis. – lucas

+0

Oups, je n'ai pas vu votre flush() là-bas. hmm. Je n'utilise généralement pas flush mais il semble que cela devrait fonctionner. – lucas

0

Quelle est l'implémentation de hashcode et equald dans User? Peut-être que tous vos utilisateurs sont considérés comme identiques dans l'ensemble, de sorte qu'un seul est enregistré.

Questions connexes