JPA Hibernate mySQL Persistence ManytoMany Java Iteration
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 :
Code:
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()... |
classe Menu:
Code:
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> (); |
Celà me génère 3 tables :
- 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:
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.