IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

JPA Java Discussion :

JPA Hibernate mySQL Persistence ManytoMany Java Iteration


Sujet :

JPA Java

  1. #1
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 17
    Par défaut 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 : 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()...
    classe Menu:
    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> ();
    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 : 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.

  2. #2
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 17
    Par défaut
    J'ai trouvé

    Il me suffit de ne pas faire de merge! C'est hibernate gère la mise à jour des tables.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    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);
    		}
    	}

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. persistance JPA hibernate Mysql primefaces
    Par Leroy.co dans le forum JPA
    Réponses: 11
    Dernier message: 16/05/2013, 13h05
  2. [Core] JPA/Hibernate/MySQL persistance données Excel (POI)
    Par high4life dans le forum Hibernate
    Réponses: 2
    Dernier message: 29/05/2012, 14h23
  3. JBoss + JPA + Hibernate + MySql
    Par Iori Yagami dans le forum Wildfly/JBoss
    Réponses: 4
    Dernier message: 17/11/2011, 09h36
  4. JPA/Hibernate/Spring sans Java EE ?
    Par dingoth dans le forum JPA
    Réponses: 10
    Dernier message: 08/09/2011, 11h47
  5. Réponses: 3
    Dernier message: 19/05/2006, 20h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo