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 :

Mapping list many-to-many


Sujet :

Hibernate Java

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Mapping list many-to-many
    Bonjour à tous,

    Je suis débutant sous hibernate, et ca fait plusieurs jours que je cherche une solution. J'ai regardé de nombreux forum et la doc d'hibernate, j'ai beaucoup d'éléments de réponses, mais je n'arrive pas à implémenter correctement pour faire ce que je veux (qui est surement très simple).

    configuration : Hibernate + Eclipse + MySql

    J'ai des Utilisateur (classe User), qui contiennent notemment une liste de catégories choisies (classe Category). nb : une catégorie peut être attachée à plusieurs utilisateurs.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class User
    {
     
        private int id = -1;
        private String login;
        private String pwd;
        private String name;
        private String firstname;
        private List categories = new ArrayList();
     
    ...
    Donc j'ai une relation many-to-many avec 3 tables : category, user, et categoryset (clé primaire : double clée étrangère)

    Déjà, est ce que je me trompe sur ce point ?

    Ensuite, je configure les fichiers de mapping. Voici mon dernier essai :

    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
     
    <hibernate-mapping package="model">
    	<class name="model.User" table="user" dynamic-update="true">
     
     		<id name="id" type="integer" unsaved-value="-1">
     			<column name="NUM_USER" sql-type="int(6)"/>
     			<generator class="increment" />
     		</id>
     
     		<property name="name" type="string">
     			<column name="NOM_USER" sql-type="char(25)" not-null="true"/>
     		</property>
     
     		<property name="firstname" type="string">
     			<column name="PRENOM_USER" sql-type="char(25)" not-null="true"/>
     		</property>
     
     		<property name="login" type="string">
     			<column name="LOGIN_USER" sql-type="char(25)" not-null="true"/>
     		</property>
     
     		<property name="pwd" type="string">
     			<column name="PASSW_USER" sql-type="char(25)" not-null="true"/>
     		</property>
     
     		<bag name="categories" table="CATEGORYSET" cascade="all">
                <key column="USER_ID"/>
                <many-to-many class="model.Category" column="CAT_ID" />
            </bag>
     
     
    	</class>
    </hibernate-mapping>
    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
     
    <hibernate-mapping package="model">
    	<class name="Category" table="category"  dynamic-update="true">
     
    		<id name="id" type="integer" unsaved-value="-1">
     			<column name="NUM_CAT" sql-type="int(6)"/>
     			<generator class="increment" />
     		</id>
     
     		<property name="name" type="string">
     			<column name="NOM_CAT" sql-type="char(25)" not-null="true"/>
     		</property>
     
     		<property name="description" type="string">
     			<column name="DESC_CAT" sql-type="char(200)" not-null="true"/>
     		</property>
     
     		<bag name="users" table="CATEGORYSET" inverse="true" cascade="all">
                <key column="CAT_ID" />
                <many-to-many class="model.User" column="USER_ID" />
            </bag>
     
    	</class>
    </hibernate-mapping>
    Deuxième question subsidiaire : suis-je obligé de faire figurer le bag du fichier de mapping des catégories par une liste d'utilisateurs pour chaque catégorie dans mon fichier java ? car en réalité je n'en ai pas besoin..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public class Category
    {
     
     private int id = -1;
     private String name;
     private String description;
     private List users = new ArrayList(); //obligatoire ? 
    ...
    Si oui : dois je bien rajouter l'utilisateur dans la liste dès que la catégorie concernée est choisie par un user ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void setOneCategories(Category category)
        {
            categories.add(category);
            category.setOneUser(this);
        }
    Je n'ai pas de problème pour l'ajout. Du moins pas encore

    Je n'ai pas de problème non plus pour la suppression d'un User :

    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
     
    public boolean delete(Object o,TypeObjet t) throws HibernateException {
     
    		List<String> info = new ArrayList();
     
    		switch(t)
    		{
    			case user:
     
    				User u = (User)o;
     
    				info.add(0,u.getName());
    				info.add(1,u.getFirstname());
     
    				User temp = (User)load(info,t);
     
    				if(temp != null)
    				{
    					Session session = HibernateUtil.currentSession();
     
    					Transaction tx = session.beginTransaction();
     
    					temp.removeCategory();        
     
    					session.update(temp);
     
    					session.delete(temp);
     
    					tx.commit();
     
    					HibernateUtil.closeSession();
    					System.out.println("L utilisateur a été supprimé");
     
    					return true;
    				}	
     
    ...
    Par contre, il m'est impossible de supprimer une catégorie : J'ai une exception du type "impossible de supprimer un enregistrement père : une contrainte externe l'en empêche".

    J'ai essayé de multiples configurations (on-delete="cascade", cascade="all-delete-orphan", etc... ), mais rien n'y change, ou alors je me retrouve avec des erreurs de compil pour cause de mapping incorrect.

    en attendant, j'ai contourné le problème : je charge tout les utlisateurs, je cherche pour chacun d'entre eux si ils ont choisis la catégorie en cours de suppression, si oui je la supprime de la liste et je met à jour le user. Puis à la fin je supprime la catégorie. Mais bon, c'est surement pas comme ca qu'il faut s'y prendre, j'ai un peu l'impression de réinventer la roue ...

    J'espère avoir été assez clair, si quelqu'un peut m'aider à supprimer une catégorie ca serait très sympa
    merci d'avance

  2. #2
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    vraiment personne ne peut m'aider ?
    même pas sur la logique de construction ?

  3. #3
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    vraiment, toujours pas ?

  4. #4
    Membre éprouvé Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Points : 1 050
    Points
    1 050
    Par défaut
    première question: c'est bon de ce cote la, et le mapping est correct (même si personnellement je n'aime pas utiliser les bags je préfère les sets )

    ensuite question subsidiaire: non tu n'es pas obligé, mais il est en général conseillé de conserver le mapping bidirectionnel

    d'ailleurs il est fort possible que ton problème vienne du mapping, et plus exactement du inverse=true
    comme category est considérée comme cible de la relation, hibernate s'attend a ce que les changements soient effectués au niveau de user

    cf doc officielle, lire la description de inverse

  5. #5
    Candidat au Club
    Inscrit en
    Janvier 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    merci beaucoup pour tes réponses.
    Je suis content de savoir que j'ai quand même quelques trucs de juste

    oui effectiement plus je regarde des exemples, plus je vois que les gens préfèrent en général le set. Je n'ai pas encore bien compris toutes les différences, mais je vais me pencher dessus.

    je vais chercher du coté du reverse et/ou des autres paramètres, et je te tiens au courant rapidement.

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    Citation Envoyé par leon99 Voir le message
    merci beaucoup pour tes réponses.
    Je suis content de savoir que j'ai quand même quelques trucs de juste

    oui effectiement plus je regarde des exemples, plus je vois que les gens préfèrent en général le set. Je n'ai pas encore bien compris toutes les différences, mais je vais me pencher dessus.

    je vais chercher du coté du reverse et/ou des autres paramètres, et je te tiens au courant rapidement.
    Le Set convient jusqu'à une certaine taille : au-delà le List est préférable pour des raisons de performance… (et il faut alors assurer l'unicité des individus du contenu dans le code…)

    Le Set impliquant l'unicité des membres, la vérification d'unicité est faite par l'ORM et les performances peuvent s'écrouler dans certains patterns d'utilisation…

  7. #7
    Membre confirmé Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Points : 576
    Points
    576
    Par défaut
    Salut ^^
    A ta place, j'enleverai le lien bidirectionnelle, ca t'aidera a voir plus clair.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    64
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 64
    Points : 54
    Points
    54
    Par défaut
    Ton problème ne pourrais pas venir de la BD ? Tu as peut être certaine contraine qui empeche hibernate (telle qu'il a compris ta bd) de supprimer le tuple.


    Sinon, moi aussi j'ai un problème un peu similaire. J'utilise les annotations propre à EJB3 (si je me trompe pas). Il cré les tables (dont une contenant les clé identifiant de chaqu'une des 2 tables, pour les relations. Je ne sais pas comment on fait pour préciser le nom .. ca m'intéresse ). J'arrive à ajouter (j'ai pas tester la suppression ou autre) et j'utilise aussi mysql. Le problème, c'est que je sais pas trop comment réglé (et ca fait plusieurs fois que je vois le truc "reverse" ou "inverse" ... et moi, j'ai rien de tout ca dans mon code ). Donc voilà, j'ai 3 tables dans la bd, et celle de liaison, ben elle est toujours vide .

    Le problème n'est peut etre pas le même, mais on essaie de faire la meme chose en tout cas .

    Enfin, si ca intéresse :
    http://www.developpez.net/forums/sho...d.php?t=472496

Discussions similaires

  1. Mapping many 2 many vers une list
    Par breezer911 dans le forum Hibernate
    Réponses: 1
    Dernier message: 14/08/2007, 16h21
  2. Un peu de mal a comprendre le concepte "one-to-many" et "many-to-many"
    Par chriscoolletoubibe dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/03/2007, 18h50
  3. Map : many-to-many
    Par Ho(c)ine. dans le forum Hibernate
    Réponses: 3
    Dernier message: 26/02/2007, 09h51
  4. mapping many-to-many ?
    Par anayathefirst dans le forum Hibernate
    Réponses: 4
    Dernier message: 10/01/2007, 00h33
  5. [hibernate 3] mapping many-to-many
    Par darkyspirit dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/12/2006, 19h37

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