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

Hibernate Java Discussion :

Problème avec un ManyToMany


Sujet :

Hibernate Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut Problème avec un ManyToMany
    Bonjour,

    J'utilise Hibernate annotation. J'ai un pb sur une relation ManyToMany. C'est peut-être un problème par rapport au développeur mais j'ai un malfou à trouver une explication claire.
    Alors voila j'ai 2 classes : User et Telechargement. Un User peut avoir plusieurs Telchargement etun Telechargement peut être affecté à plusieurs User (un manytomany quoi) leur création est indépendante. ensuite j'ai fait une page permettant d'affecter les relations dans les 2 sens. Mais malheureusement ca ne fonctionne que dans un seul ?
    normal ?
    une autre methode ou mauvais paramètrage ?

    Merci d'avance. Julien C.

    Mon code :

    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
     
    class User{
    //...
    	@ManyToMany
    	public List<Telechargement> getTelechargements() {
    		return telechargements;
    	}
    //...
    }
     
     
    class Telechargement{
    //...
        @ManyToMany( mappedBy="telechargements" )
        public List<User> getUsers() {
            return users;
        }
    //...
    }
     
     
     
    // Affectation des téléchargements à un utilisateur
    // Je supprime toutes les relations et je l'ai recrée
    // la ca fonctionne bien
    User user = userManager.getUser( idUser );
    user.getTelechargements().clear();
    for (Telechargement telechargement : telechargements) {
    	user.getTelechargements().add(telechargement);
    }
    user = userManager.saveUser(user);
     
     
     
    // Affectation d'utilisateurs à un télécharment
    // Je supprime toutes les relations et je l'ai recrée
    // Et la ca ne fonctionne pas
    Telechargement telechargement = telechargementManager.get( idTelechargement );
    telechargement.getUsers().clear();
    for (User user : users) {
    	telechargement.getUsers().add(user);
    }
    telechargement = telechargementManager.save(telechargement);

  2. #2
    Modérateur
    Avatar de OButterlin
    Homme Profil pro
    Inscrit en
    Novembre 2006
    Messages
    7 313
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 7 313
    Billets dans le blog
    1
    Par défaut
    Il me semble qu'il manque l'annotation @JoinTable dans User.
    Voici l'exemple dans la doc Hibernate
    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
     
    @Entity
    public class Employer implements Serializable {
    @ManyToMany(
    targetEntity=org.hibernate.test.metadata.manytomany.Employee.class,
    cascade={CascadeType.PERSIST, CascadeType.MERGE}
    )
    @JoinTable(
    name="EMPLOYER_EMPLOYEE",
    joinColumns={@JoinColumn(name="EMPER_ID")},
    inverseJoinColumns={@JoinColumn(name="EMPEE_ID")}
    )
    public Collection getEmployees() {
    return employees;
    }
    ...
    }
     
     
    @Entity
    public class Employee implements Serializable {
    @ManyToMany(
    cascade={CascadeType.PERSIST, CascadeType.MERGE},
    mappedBy="employees"
    targetEntity=Employer.class
    )
    public Collection getEmployers() {
    return employers;
    }
    }
    Dans ce cas d'association bidirectionnelle, Employer est maître de la relation et ignoré dans Employee.

    A+
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Juillet 2003
    Messages : 43
    Par défaut
    Dans ce cas d'association bidirectionnelle, Employer est maître de la relation et ignoré dans Employee.
    Je pense que c'est ca mon problème. On ne peut mettre à jour la relation que d'1 seul côté dans mon cas : User. le JoinTable doit avoir une valeur par défaut.
    Donc j'ai tout fait avec mes petites menottes et ça à l'air de fonctionner .
    Merci. Julien .


    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
     
     
    Telechargement telechargement = telechargementManager.get( idTelechargement );
     
    // on charge tous les utilsateurs qui doivent possèder le téléchargement
    for (Long idUser : idUsers) {
    	newUsers.add( userManager.getUser( String.valueOf(idUser) ) );
    }
     
    if (log.isDebugEnabled()) log.debug("vérification des affectations en cours" );
    // Suppression anciennes relations
    for (User oldUser : telechargement.getUsers()) {
    	if ( newUsers.contains( oldUser ) ){
    		if (log.isDebugEnabled()) log.debug("l'utilisateur possède déjà le téléchargement ! " + oldUser );
    		// l'utilisateur à déjà le telechargement dans sa liste on ne fait rien
    		// on le supprime de la liste des utilisateurs auquel on doit ajouter le telechargement
    		newUsers.remove( oldUser );
    	} else {
    		if (log.isDebugEnabled()) log.debug("l'utilisateur possèdait le téléchargement, on le supprime ! "  + oldUser );
    		// l'utilisateur n'a plus le téléchargement, on supprime le téléchargement de sa liste
    		oldUser.getTelechargements().remove( telechargement );
    		try{
    			oldUser = userManager.saveUser(oldUser);
    		} catch (Exception ex) {
    			log.error("impossible de sauvegarder l'utilisateur !" );
    			errors = true;
    		}
    	}
     
    }
     
    // Nouvelles affectations
    if (log.isDebugEnabled()) log.debug("Création des nouvelles affectations" );
    for (User newUser : newUsers) {
    	if (log.isDebugEnabled()) log.debug("Ajout du téléchargement à l'utilisateur : " + newUser );
    	newUser.getTelechargements().add(telechargement);
    	try{
    		newUser = userManager.saveUser(newUser);
    	} catch (Exception ex) {
    		log.error("impossible de sauvegarder l'utilisateur !" );
    		errors = true;
    	}
    }

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

Discussions similaires

  1. Problème avec une relation ManytoMany
    Par GodziFP dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/08/2014, 12h50
  2. Réponses: 2
    Dernier message: 11/02/2013, 13h22
  3. Réponses: 2
    Dernier message: 15/06/2011, 10h15
  4. Problème avec la mémoire virtuelle
    Par Anonymous dans le forum CORBA
    Réponses: 13
    Dernier message: 16/04/2002, 16h10

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