Bonjour,
je me suis mis à ces différentes technos depuis seulement quelques semaines et là je suis tombé sur un os....
J'ai 2 classes : UGroup & Menu liées par une relation ManyToMany (donc 1 groupe a accès à plusieurs menus et 1 menu est visible par plusieurs groupes).
classe UGroup :
classe Menu:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 @Entity public class UGroup implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @ManyToMany(cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.EAGER) @JoinTable(name="ugroup_menu", joinColumns=@JoinColumn(name = "ugroup_id", referencedColumnName="id"), inverseJoinColumns = @JoinColumn(name = "menu_id", referencedColumnName="id")) private Set<Menu> menus = new HashSet<Menu>(); getters() & setters()...
Celà me génère 3 tables :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 @Entity public class Menu implements Serializable { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Integer id; @ManyToMany(cascade=javax.persistence.CascadeType.ALL, fetch=FetchType.EAGER, mappedBy="menus") private Set<UGroup> uGroups = new HashSet<UGroup> ();
- ugroup
- menu
- ugroup_menu (ugroup_id, menu_id), la table de match entre les 2 tables précédentes.
Je dispose également d'une classe Service qui a pour but de modifier le lien entre les groupes et les menus:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 @Transactional public class Service { private EntityManager getEntityManager() { return em; } @PersistenceContext public void setEntityManager(EntityManager em) { this.em = em; } public void removeUGroup (Integer id, UGroup uGroup) { Menu menu = find(id); if (menu != null) { menu = em.merge(menu); uGroup = em.merge(uGroup); uGroup.getMenus().remove(menu); menu.getUGroups().remove(uGroup); } } public void affectUGroups (Integer id, List<Integer> ugIdList) { Menu menu = find (id); if (menu != null) { Iterator<UGroup> it; Iterator<Integer> iter; UGroup ug; Set<UGroup> s = new HashSet<UGroup>(); try { it = menu.getUGroups().iterator(); while(it.hasNext()) { ug=it.next(); s.add(ug); } it = s.iterator(); while (it.hasNext()) { ug = it.next(); ug=findUg(ug.getId()); if (!ugIdList.contains(ug.getId())) { removeUGroup(id, ug); } }//while } catch (Exception e) {} }//try }
Dans la méhtode affectUGroups (), je veux "casser" les liens qu'il peut y avoir entre le menu (dont l'id est en paramètre) et une liste de d'id de groupes (ugIdList en paramètes).
Je parcourt la liste d'id de groupe "ugIdList" afin d'effectuer ces opération, en faisant appel à la méthode removeUGroup () à chaque itération.
Mon soucy est que bizarement seul le dernier élément de "ugIdList" est pris en compte (donc un seul lien est supprimé dans la table "ugroup_menu") alors que tous les autres sont ignorés.
Quelqu'un aurait une explication et une solution à mon problème?
Merci d'avance.
Partager