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 :

many-to-many dans le fichier mapping hbm.xml


Sujet :

Hibernate Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyste et Développeur Java
    Inscrit en
    Novembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Analyste et Développeur Java

    Informations forums :
    Inscription : Novembre 2006
    Messages : 53
    Par défaut many-to-many dans le fichier mapping hbm.xml
    Bonjour,

    J'ai fait une application en Hibernate avec deux entité Person et Event, et j'ai trouvé dans la documentation si la relation entre les deux entité est une association unidirectionnelle on introduit l'option <many-to-many column="EVENT_ID" class="Event"/> pourquoi on a pas mis le <many-to-one> puisqu'on veut dans un premier temps juste ajouter une instance de la classe Event à la collection des références de la classe Event à une instance de la classe Person.

    Voila le fichier mapping de la classe Person ----> Person.hbm.xml :


    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
    <hibernate-mapping package="org.hibernate.tutorial.domain">
     
        <class name="Person" table="PERSON">
     
            <id name="id" column="PERSON_ID">
                <generator class="native"/>
            </id>
            <property name="age" type="integer"/>
            <property name="firstname" type="string"/>
            <property name="lastname" type="string"/>    
     
           <!-- You add an instance of Event to the collection of event references, of an instance of Person    -->
            <set name="events" table="PERSON_EVENT">
               <key column="PERSON_ID"/>
               <many-to-many column="EVENT_ID" class="Event"/>
            </set> 
     
            <set name="emailAddresses" table="PERSON_EMAIL_ADDR">
               <key column="PERSON_ID"/>
               <element type="string" column="EMAIL_ADDR"/>
            </set>
     
        </class>
     
    </hibernate-mapping>
    J'arrive pas à comprendre celui-la car l'étape suivante c'est d'utiliser l'associations bidirectionnelles en introduisant la notion de inverse comme par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
           <set name="participants" table="PERSON_EVENT" inverse="true" >  <!-- inverse="true" -->
                <key column="EVENT_ID"/>
                <many-to-many column="PERSON_ID" class="Person"/>            
            </set>
    Cordialement

  2. #2
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Bonjour,

    Attention, l'attribut "inverse" ne veut pas dire qu'une relation est bidirectionnelle ou non. Cet attribut permet de spécifier si on met à jour ou non la relation dans la base après un ajout ou retrait dans la collection lors d'un sauvegarde de l'entité. C'est un peu difficile à expliquer sans exemple mais c'est mieux si tu lis la doc.

    A+.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyste et Développeur Java
    Inscrit en
    Novembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Analyste et Développeur Java

    Informations forums :
    Inscription : Novembre 2006
    Messages : 53
    Par défaut
    Bonjour,

    En fait, j'ai remarqué que les documentations qui parlent de les Associations bidirectionnelles sans ou avec table de jointure introduisent l'option "inverse" pour tous les types de bidirectionnels

    - one-to-many / many-to-one
    - one-to-one
    - many-to-many

    et pour l'association unidirectionnelle, j'ai fait un exemple par mes deux entité Event & Person en créant deux fichiers mapping avec des associations unidirectionnelle <many-to-many> et ca marche bien surtout coté persistante.

    J'aimerais bien savoir la différences et le rôle entre Associations bidirectionnelles et unidirectionnelle car j'ai un peu de conflit dans la générations de code hibernate à partir d'un MCD.

    merci infiniment pour vos aides et conseils.

  4. #4
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Re,

    Une relation est bidirectionnelle quand tu peux naviguer des deux côtés, que ce soit one-to-many/many-to-one ou many-to-many. Tu peux faire un a.getB() et un b.getA().
    Le mot "inverse" indique quel est l'extrémité de la relation,
    Exemple pour dans ta précédente discussion:
    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <class name="Event" table="EVENTS">
           <!-- ... -->	
            <set name="participants" table="PERSON_EVENT" inverse="true">
                <key column="EVENT_ID"/>
                <many-to-many column="PERSON_ID" class="events.Person"/>
            </set>
     
        </class>

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <class name="Person" table="PERSON">
    	<!-- ... -->	
    	<set name="events" table="PERSON_EVENT" >
                <key column="PERSON_ID"/>
                <many-to-many column="EVENT_ID" class="Event"/>
            </set>
    </class>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    event.getParticipants().add(unePersonne);
    session.persist(event); // la table PERSON_EVENT ne sera pas mise à jour
    unePersonne.getEvents().add(event);
    session.persit(unePersonne); // ici, la table PERSON_EVENT sera mise à jour
    Tu ne dois déclarer l'inverse à true dans un seul mapping mais pas les deux.

    A+.

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyste et Développeur Java
    Inscrit en
    Novembre 2006
    Messages
    53
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Analyste et Développeur Java

    Informations forums :
    Inscription : Novembre 2006
    Messages : 53
    Par défaut
    Bonjour,

    Je vous remercie pour cette explication mais je vois pas le vrai rôle de "inverse" dans cet exemple, tant on peut pas faire la mise à jour dans la table PERSON_EVENT, donc on peut rester en association unidirectionnelle dans un seul sens de Person --> Event.

    et pour "Le mot "inverse" indique quel est l'extrémité de la relation" ca veut dire quoi exactement au niveau de conception.

    Cordialement

  6. #6
    Rédacteur/Modérateur
    Avatar de andry.aime
    Homme Profil pro
    Inscrit en
    Septembre 2007
    Messages
    8 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Ile Maurice

    Informations forums :
    Inscription : Septembre 2007
    Messages : 8 391
    Par défaut
    Re,

    Quand on parle de bidirectionnel, cela veut dire que tu peux naviguer des deux côtés (a.getB() et b.getA()), si c'est unidirectionnel tu ne pourras naviguer que d'un seul côté (a.getB() seulement par exemple).
    Quand tu as une relation bidirectionnel, tu dois designer l'extrémité des relations (responsable de la sauvegarde des relations) en utilisant l'attribut inverse.
    Regarde ou se trouve l'attribut inverse à true dans les mapping (xml) et regarde ce qui se passe lors des sauvegardes (le code java et les commentaires) et tu comprendras son rôle. Inverse se joue sur le côté des relations qui permet de faire la sauvegarde.

    A+.

Discussions similaires

  1. [1.x] Relation Many to Many et colonnes dans la table association
    Par PeytaWodka dans le forum Symfony
    Réponses: 11
    Dernier message: 16/05/2011, 10h26
  2. Fichier <table>.hbm.xml : sans aucun champs
    Par zakir dans le forum Hibernate
    Réponses: 1
    Dernier message: 31/05/2007, 17h57
  3. [Security] type booleen dans un fichier de contexte xml
    Par rc_29 dans le forum Spring
    Réponses: 5
    Dernier message: 04/04/2007, 09h21
  4. 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
  5. Enregistrer DBGrid dans un fichier excel ou xml ou autre
    Par Ice-tea dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/08/2006, 12h42

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