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 :

Mapper table d'association many-to-many


Sujet :

Hibernate Java

  1. #1
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut Mapper table d'association many-to-many
    Bonjour,
    Mapper une table d'association many-to-many contenant 3 autres atributs3.
    les 3 tables sont :

    * absence ( code_a pk,libelle string)
    * personnel(code_p pk,nom string,prenom string)
    *absence_personnel
    ( ( code_a,code_p) pk, date_absence Date, duree int,motif sring)

    absence.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
     
     
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.gh.model">
     <class name="Absence" table="absence">
       <id name="code_a" column="CODE_A" type="java.lang.Integer">
            <generator class="native"/>
       </id>
     <property name="libelle" column="LIBELLE" type="java.lang.String"/>
     
     <set name="absences" table="absence_personnel">
               <key column="CODE_A" />
               <many-to-many column="MATRICULE_P" class="Personnel"/>
        </set>
     
      </class>
    </hibernate-mapping>
    de meme pr personnel.hbm.xml
    on a du mal a mapper la table d'association absence_personnel car elle contient des attributs propres a elle

    Merci d'avance.

  2. #2
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    3 274
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 3 274
    Points : 4 141
    Points
    4 141
    Par défaut
    Tu peux utiliser deux one-to-many.
    Ta classe d'association sera une classe à part entière avec ses attributs.

    Le many-to-one s'utilise quand on a pas besoin d'attributs supplémentaires dans la classe d'association.

  3. #3
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    je comprends tjrs pas

  4. #4
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Citation Envoyé par zaineb.z
    les 3 tables sont :

    * absence ( code_a pk,libelle string)
    * personnel(code_p pk,nom string,prenom string)
    *absence_personnel
    ( ( code_a,code_p) pk, date_absence Date, duree int,motif sring)
    Bonjour,

    la table absence me semble plus une table de code/libelle qu'une table d'absence.

    l'idee est que l'on a :

    Personnel <--- "many-to-one" ---> Absence
    CodeAbsence <--- "many-to-one" ---> Absence

    ce qui donnerai en gros
    personnel.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
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.gh.model">
     <class name="Personnel" table="personnel">
       <id name="matricule" column="MATRICULE_P" type="java.lang.String">
            <generator class="native"/>
       </id>
     	<property name="nom" column="NOM" type="java.lang.String"/>
     	<property name="prenom" column="PRENOM" type="java.lang.String"/>
     
     	<set 	name="absences" 
                lazy="true"
                cascade="all-delete-orphan">
               <key column="MATRICULE_P" />
               <one-to-many class="Absence"/>
        </set>
     
      </class>
    </hibernate-mapping>
    codeabsence.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
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.gh.model">
     <class name="CodeAbsence" table="absence">
       <id name="code_a" column="CODE_A" type="java.lang.Integer">
            <generator class="native"/>
       </id>
     	<property name="libelle" column="LIBELLE" type="java.lang.String"/>
     
     	<set 	name="absences" 
                lazy="true">
               <key column="CODE_A" />
               <one-to-many class="Absence"/>
        </set>
      </class>
    </hibernate-mapping>
    et absence.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
    <?xml version="1.0" encoding='UTF-8'?>
    <!DOCTYPE hibernate-mapping PUBLIC
              "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
              "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
     
    <hibernate-mapping package="com.gh.model">
     <class name="Absence" table="absence_personnel">
     	<composite-id>
     		<key-many-to-one name="personnel" column="MATRICULE_P" class="Personnel"/>
     		<key-many-to-one name="codeAbscence" column="CODE_A" class="CodeAbsence"/>
     	</composite-id>
     
     <property name="dateAbsence"  column="DATE_ABSENCE" type="java.util.Date" />
     <property name="duree"  column="DUREE" type="java.lang.Integer" />
     <property name="motif"  column="MODIF" type="java.lang.String" />
     
     
     
      </class>
    </hibernate-mapping>

  5. #5
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    Bonjour,
    Merci c'est gentil de m'avoir repondu
    je testerai cela et puis j'espere que ca va marcher
    Bonne journée

  6. #6
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    est ce que c'est obligatoire de mettre un <set> absence au niveau du fichier CodeAbsence.hbm.xml ?

  7. #7
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    non,

    Tout dépend de la classe, mais en principe un Code-Libelle n'a que deux attributs le code et ... le libelle .

  8. #8
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    je ss perdue la
    voila mon diagramme de classes joint
    et puis le code java des classes :
    Personnel.Java :
    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
     
    public class Personnel
    {
       public String nom_p;
       public String prenom_p;
       public String cin_p;
       public String tel_p;
       public Date date_embauche;
       public String mail_p;
       public String adresse_p;
       public Date date_naissance_p;
       public String civilite_p;
       public String etat_civil_p;
       public String cnss;
       public String cimr;
     
       public AbsencePersonnel absenceP; // je peux la declarer en tant que quoi                                             //au niveau du hbm?
     
     
    }
    Personnel.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
    26
    27
    28
     
    <hibernate-mapping package="com.gh.model">
     <class name="Personnel" table="personnel">
      <id name="matricule" column="MATRICULE_P" type="java.lang.String">
            <generator class="native"/>
       </id>
     
    <property name="nom_p" column="NOM_	p" type="java.lang.String"/>
    <property name="prenom_p" column="PRENOM_P" type="java.lang.String"/>
    <property name="cin_p" column="CIN_P" type="java.lang.String"/>
    <property name="tel_p" column="TEL_P" type="java.lang.String"/>
    <property name="date_embauche" column="DATE_EMBAUCHE" type="java.util.Date"/>
    <property name="mail_p" column="PRENOM_P" type="java.lang.String"/>
    <property name="adresse_p" column="ADRESSE_P" type="java.lang.String"/>
    <property name="date_naissance_p" column="DATE_NAISSANCE_P" type="java.util.Date"/>
    <property name="civilite_p" column="CIVILITE_P" type="java.lang.String"/>
    <property name="etat_civil_p" column="ETAT_CIVIL_P" type="java.lang.String"/>
    <property name="cnss" column="CNSS_P" type="java.lang.String"/>
    <property name="cimr" column="CIMR_P" type="java.lang.String"/>
     
       <set 	name="absences" 
                lazy="true"
                cascade="all-delete-orphan">
               <key column="MATRICULE_P" />
               <one-to-many class="AbsencePersonnel"/>
       </set>
     
       </class>
    Absence.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public class Absence {
     
    	protected String libelle; 
    	protected  AbsencePersonnel abscenceP;
    }
    Absence.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
     
    <class name="Absence" table="absence">
       <id name="code_a" column="CODE_A" type="java.lang.Integer">
            <generator class="native"/>
       </id>
     	<property name="libelle" column="LIBELLE" type="java.lang.String"/>
     
     	<set 	name="personnel" 
                lazy="true">
               <key column="CODE_A" />
               <one-to-many class="AbsencePersonnel"/>
        </set>
     
       </class>
    AbsencePersonnel.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public class AbsencePersonnel {
     
    	   protected float duree;
    	   protected String MOTIF;
    	   protected Date date_abs;
    	   protected Set absences= new HashSet();
    	   protected Set personnel=new HashSet();
     
     
    }
    AbsencePersonnel.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
     
    <class name="AbsencePersonnel" table="absence_personnel">
     
     	<composite-id>
     		<key-many-to-one name="matricule_p" column="MATRICULE_P" class="Personnel"/>
     		<key-many-to-one name="code_a" column="CODE_A" class="CodeAbsence"/>
     	</composite-id>
     
     <property name="date_abs"  column="DATE_ABS" type="java.util.Date" />
     <property name="duree"  column="DUREE" type="java.lang.Integer" />
     <property name="motif"  column="MOTIF" type="java.lang.String" />
     
     </class>
    qu'est ce que vs en pensez?c'est correct ?
    Images attachées Images attachées  

  9. #9
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    C'est bien se compliquer la vie

    Reprenons depuis le debut.

    Un Personnel peux avoir plusieurs AbsencePersonnel (c'est pas bien, mais c'est légal )

    Donc dans Personnel il faut une collection d'AbsencePersonnel
    - Set si pas de notion d'ordre => set dans le fichier hbm
    - List si ordre (par date par exemple) => list dans le fichier hbm

    Absence est un code libelle avec uniquement deux attributs le code (clef dans la table) et le libellé.

    L'AbsencePersonnel ne concerne qu'une personne et qu'un motif.
    => schématiquement

    Personnel 1.1-----0.*AbsencePersonnel 1.1-----Abscence


    donc on obtiens en gros :
    Absence.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public class Absence {
    	protected String libelle; 
    	protected Integer code;
    }
    ce qui donne Absence.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <class name="Absence" table="absence">
       <id name="code" column="CODE_A" type="java.lang.Integer">
            <generator class="native"/>
       </id>
       <property name="libelle" column="LIBELLE" type="java.lang.String"/>
     
    </class>
    ensuite

    Personnel.Java :
    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
    public class Personnel
    {
     //@TODO remplace les attributs public par private avec les get/set qui vont bien
       public String matricule; 
       public String nom_p;
       public String prenom_p;
       public String cin_p;
       public String tel_p;
       public Date date_embauche;
       public String mail_p;
       public String adresse_p;
       public Date date_naissance_p;
       public String civilite_p;
       public String etat_civil_p;
       public String cnss;
       public String cimr;
     
       public Set<AbsencePersonnel> absences; //ou List
    }
    Personnel.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
    26
    27
    <hibernate-mapping package="com.gh.model">
     <class name="Personnel" table="personnel">
      <id name="matricule" column="MATRICULE_P" type="java.lang.String">
            <generator class="native"/>
       </id>
     
    <property name="nom_p" column="NOM_	p" type="java.lang.String"/>
    <property name="prenom_p" column="PRENOM_P" type="java.lang.String"/>
    <property name="cin_p" column="CIN_P" type="java.lang.String"/>
    <property name="tel_p" column="TEL_P" type="java.lang.String"/>
    <property name="date_embauche" column="DATE_EMBAUCHE" type="java.util.Date"/>
    <property name="mail_p" column="PRENOM_P" type="java.lang.String"/>
    <property name="adresse_p" column="ADRESSE_P" type="java.lang.String"/>
    <property name="date_naissance_p" column="DATE_NAISSANCE_P" type="java.util.Date"/>
    <property name="civilite_p" column="CIVILITE_P" type="java.lang.String"/>
    <property name="etat_civil_p" column="ETAT_CIVIL_P" type="java.lang.String"/>
    <property name="cnss" column="CNSS_P" type="java.lang.String"/>
    <property name="cimr" column="CIMR_P" type="java.lang.String"/>
     
       <set 	name="absences" 
                lazy="true"
                cascade="all-delete-orphan">
               <key column="MATRICULE_P" />
               <one-to-many class="AbsencePersonnel"/>
       </set> ou <list  ....</list>
     
       </class>
    et pour finir AbsencePersonnel.java
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class AbsencePersonnel {
     
    //@TODO idem que pour Personnel 
    	   protected float duree;
    	   protected String motif;
    	   protected Date date_abs;
    	   protected Absence absence;
    	   protected Personel personnel;
     
     
    }
    AbsencePersonnel.hbm.xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <class name="AbsencePersonnel" table="absence_personnel">
     
     	<composite-id>
     		<key-many-to-one name="personnel" column="MATRICULE_P" class="Personnel"/>
     		<key-many-to-one name="absence" column="CODE_A" class="CodeAbsence"/>
     	</composite-id>
     
     <property name="date_abs"  column="DATE_ABS" type="java.util.Date" />
     <property name="duree"  column="DUREE" type="java.lang.Integer" />
     <property name="motif"  column="MOTIF" type="java.lang.String" />
     
     </class>
    et voilà en gros.

  10. #10
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    Merci c'est trop gentil de ta part ,tu m'as sauvé la vie
    au faite , commen generer les fichiers de mapping automatiquement?
    je developpe sous MyEclipse 4.1 ,hibernate 3.

  11. #11
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Pour générer des fichiers il y a XDoclet

  12. #12
    Membre éprouvé
    Profil pro
    Développeur Back-End
    Inscrit en
    Avril 2003
    Messages
    782
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Back-End

    Informations forums :
    Inscription : Avril 2003
    Messages : 782
    Points : 935
    Points
    935
    Par défaut
    Ah j'oubliai :

    il y a aussi les annotations depuis java5

  13. #13
    Membre régulier
    Inscrit en
    Juin 2007
    Messages
    328
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 328
    Points : 115
    Points
    115
    Par défaut
    merci, est ce que je dois telecharger tous les *.zip qui se trouvent sur ce lien?
    et ensuite je mettrai le package ou?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 15
    Points : 13
    Points
    13
    Par défaut
    Je me permets de poster à la suite de ce topic pour ma question.
    J'ai une table Utilisateurs et une table Questionnaires avec une relation Many-to-Many entre elles.

    Je veux rajouter un boolean "Effectué" dans la table de jointure. Est-il possible de mapper ca avec Hibernate ou dois-je explicitement créer 1 table (et une classe) intermédiaire reliées par des relations Many-To-One ?

    Merci !

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 25/08/2013, 01h02
  2. Classe d'association, scaffolding et Many to many
    Par flotho dans le forum Grails
    Réponses: 0
    Dernier message: 09/02/2012, 18h56
  3. Requete SQL entre 2 tables liés par une relation many to many
    Par macmanaman dans le forum Langage SQL
    Réponses: 8
    Dernier message: 06/05/2009, 16h37
  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. Réponses: 3
    Dernier message: 26/02/2007, 10h14

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