2017-10-19 47 views
4

Disons que j'ai deux entités: Organisation et Utilisateur. Chaque utilisateur peut être membre de plusieurs organisations et chaque organisation peut avoir plusieurs utilisateurs. Maintenant, je veux supprimer une organisation (disons qu'elle a 1000 membres). Lorsque l'utilisateur a peu d'organisations, ce code est ok:Comment supprimer des objets enfants d'une relation @ManyToMany avec beaucoup d'enfants dans JPA et Hibernate

void removeOrgFromUser(Integer userId,Integer orgId){ 
    User user = session.load(User.class, userId); 
    for (Organization org : user.organizations) { 
     if(org.getId().equals(orgId)) 
      user.organizations.remove(org); 
    } 
    session.update(user); 
} 

Mais lorsque le nombre d'organisation est de 10.000, cette solution n'a pas une bonne performance.

Comment puis-je résoudre ce problème?

+0

Supprime les lignes de la table de jointure. – Antoniossss

+0

Je veux faire cela avec hibernate ou hql, –

+0

@Antoniossss avec sql native? –

Répondre

2

Comme je l'ai expliqué dans this article, si vous avez plus de 50 entités enfants, vous ne devez pas mapper une collection.

Par conséquent, @OneToMany est trompeuse car, en réalité, @OneToFew a plus de sens. Donc, quand beaucoup signifie 1000, vous faites tout faux.

Dans ce cas, il suffit de rompre le @ManyToMany association afin que vous map the join table UserOrganization.

Dans ce cas, vous devez juste les 2 @ManyToOne associations sur la table de jointure, et, vous pouvez simplement émettre une requête en vrac supprimer comme ceci:

delete from UserOrganization uo 
where uo.organization = :organization 

Ca y est!