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 :

Insertion de nouveaux éléments (Relation Many_to_Many)


Sujet :

Hibernate Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Par défaut Insertion de nouveaux éléments (Relation Many_to_Many)
    Bonjour,

    J'ai une petite question pour l'ajout d'éléments dans une relation Many_To_Many.

    Pour commencer, j'ai 2 tables :
    - CLIENTS
    - CONTACTS

    et la table de jointure :
    - J_CLIENTS_CONTACTS

    La configuration hibernate est bien réalisée. A partir d'un client je peux récupérer la liste des contacts (et inversément).

    Mon problème est celui-ci :
    Je voudrais savoir comment ajouter des contacts à un client.
    Par exemple avec une méthode (la session est ouverte)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public static void addContactToClient(Client cl,Contact ct)
    {
           cl.addContact(ct);
           ct.addClient(cl);
           session.save(ct);
           session.save(cl);
           session.getTransaction().commit();
    }
    Pour la classe Contact et Client j'ai une méthode semblable qui est celle-ci :

    Dans la classe Client : listContact est l'objet Set de la relation ManyToMany

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public void addContact(Contact ct)
    {
           listContact.add(cont);
    }
    Mais cela n'ajoute pas la relation entre les deux.
    Est-ce que quelqu'un à la solution, ou même un autre exemple concret?

    Merci!

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Par défaut
    Bonjour,

    Je me permets de remonter le sujet, la situation étant assez urgente...


    Merci.

  3. #3
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Bonjour,

    Pouvez vous nous fournir les fichiers de mapping des tables dont vous faites mention ?

  4. #4
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Par défaut
    Oui, voici :

    Client.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
    29
    30
    31
    32
    33
    34
    35
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.dbHib.user.Client" table="CLIENTS">
            <id name="id" type="integer">
                <column name="CLI_ID" precision="5" scale="0" />
                <generator class="increment" />
            </id>
            <property name="name" type="string">
                <column name="CLI_NAME" length="30" not-null="true" />
            </property>
            <property name="tel" type="string">
                <column name="CLI_TEL" length="20" not-null="true" />
            </property>
    		<property name="fax" type="string">
                <column name="CLI_FAX" length="20" not-null="true" />
            </property>   
            <property name="tvaNum" type="string">
                <column name="CLI_TVA" length="20" not-null="true" />
            </property>
     
            <property name="adrId" type="integer" insert="false" update="false">
                <column name="ADR_ID" length="5" not-null="true"/>
            </property>
     
    		<many-to-one name="address" column="ADR_ID" unique="true" not-null="true" cascade="all,delete-orphan"/>
     
    		<set name="listContact" table="J_CLI_CONT" lazy="false">
    			<key column="CLI_ID"/>
    			<many-to-many class="com.dbHib.user.Contact" column="CONT_ID" outer-join="true"/>
    		</set>
     
    	</class>
    </hibernate-mapping>
    Et Contact.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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?xml version="1.0"?>
    <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
    <hibernate-mapping>
        <class name="com.dbHib.user.Contact" table="CONTACTS">
            <id name="id" type="integer">
                <column name="CONT_ID" precision="5" scale="0" />
                <generator class="increment" />
            </id>
            <property name="tel" type="string">
                <column name="CONT_TEL" length="20" not-null="true" />
            </property>
            <property name="mail" type="string">
                <column name="CONT_MAIL" length="35" not-null="true" />
            </property>
    		<property name="fax" type="string">
                <column name="CONT_FAX" length="20" not-null="true" />
            </property>   
            <property name="lastName" type="string">
                <column name="CONT_LASTN" length="30" not-null="true" />
            </property>
     
            <property name="firstName" type="string">
                <column name="CONT_FIRSTN" length="30" not-null="true" />
            </property>
     
            <property name="role" type="string">
                <column name="CONT_ROLE" length="20" not-null="true" />
            </property>
     
            <property name="adrId" type="integer" insert="false" update="false">
                <column name="ADR_ID" length="5" not-null="true"/>
            </property>
     
    		<many-to-one name="address" column="ADR_ID" unique="true" not-null="true" cascade="all,delete-orphan"/>
     
    		<set name="listClient" table="J_CLI_CONT" lazy="false">
    			<key column="CONT_ID"/>
    			<many-to-many class="com.dbHib.user.Client" column="CLI_ID"/>
    		</set>
     
    	</class>
    </hibernate-mapping>
    Le mappage est bien réalisé (je pense), car quand je test ceci, j'ai bien le résultat voulu :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    for(int i=0;i<cliList.size();i++)
    {
    	System.out.println(cliList.get(i).getName());
    	ArrayList<Contact> contList=cliList.get(i).getContacts();
    	for(int j=0;j<contList.size();j++)
    	{
    		System.out.println("- "+contList.get(j).getRole()+" : "+contList.get(j).getFirstName()+" "+contList.get(j).getLastName());
    	}			
    }
    Le problème est vraiment l'ajout d'une relation entre un Client et un Contact.

    Merci.

  5. #5
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    Oui en effet à quelques subtilités près le mapping semble correct.
    Auriez vous le code complet de la classe contenant la méthode "addContactToClient" ainsi que le code de l'appel à cette méthode ?

  6. #6
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Par défaut
    Oui, la classe étant assez longue, je ne mets que les méthodes utilisées :

    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 abstract class DBMethods {
    	private static Session session;
    	public static boolean startSession(){
    		session = HibernateUtil.getSessionFactory().openSession();
    		return true;
    	}
     
    	public static boolean stopSession(){
    		session.close();
    		return true;
    	}
     
    	public static Client getClient(int id){
    		session.beginTransaction();
    		Client cli=(Client) session.createQuery("select cl from Client cl where cl.id = "+id).uniqueResult();
     
    		session.getTransaction().commit();
    		return cli;
    	}
     
    	public static Contact getContact(int id){
    		session.beginTransaction();
    		Contact contact=(Contact) session.createQuery("select cont from Contact cont where cont.id = "+id).uniqueResult();
     
    		session.getTransaction().commit();
    		return contact;
    	}
    	public static void addContactToClient(Client cl,Contact ct)
    	{
    	       cl.addContact(ct);
    	       ct.addClient(cl);
    	       session.save(ct);
    	       session.save(cl);
    	       session.getTransaction().commit();
    	}
    }
    Et pour la classe de test (simplifiée), si je veux signaler une relation entre le client ayant l'id 4 et le contact ayant l'id 1 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public class App {
    	public static void main(String[] args) {
    		DBMethods.startSession();
    		Client cl=DBMethods.getClient(4);
    		Contact ct=DBMethods.getContact(1);
    		DBMethods.addContactToClient(cl, ct);
    		DBMethods.stopSession();
    	}
    }
    Edit :
    Avec cette version simplifiée du programme, je fais face à une erreur de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Exception in thread "main" org.hibernate.TransactionException: Transaction not successfully started
    	at org.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:170)
    	at com.dbHib.util.DBMethods.addContactToClient(DBMethods.java:311)
    	at com.dbHib.App.main(App.java:14)
    Merci.

  7. #7
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    En effet, l'erreur vient du fait que vous commitez une transaction qui n'a pas été ouverte au préalable.
    Il vous manque une ligne au début du corps de la méthode "addContactToClient" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    public static void addContactToClient(Client cl,Contact ct)
        session.beginTransaction();
        ...
    }

  8. #8
    Membre confirmé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Novembre 2011
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Distribution

    Informations forums :
    Inscription : Novembre 2011
    Messages : 101
    Par défaut
    Merci, j'avais encore une erreur à cause de la répétition des opérations, en effet avec l'ancienne méthode, ça ajoutait 2x la relation dans la table de jointure.

    Pour ceux qui en ont besoin, il suffit en fait de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public static void addContactToClient(Client cl,Contact ct)
    {
    	session.beginTransaction();
    	cl.addContact(ct);
    	//ct.addClient(cl);
    	session.save(cl);
    	//session.save(ct);
    	session.getTransaction().commit();
    }
    Encore un grand merci we.are.the.storm

  9. #9
    Membre éprouvé Avatar de we.are.the.storm
    Profil pro
    Inscrit en
    Février 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 115
    Par défaut
    De rien,

    A noter que dans le cadre des relations bi-directionnelles, il est possible de d'empêcher la double mise à jour de la table de jointure en "débrayant" un des deux côté de l'association grâce à l'attribut inverse="true".

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

Discussions similaires

  1. Insertion d'un élément select alphabétiquement
    Par licorne dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 27/09/2007, 16h22
  2. [VS 2005 PRO] Impossible d'ajouter de nouveaux éléments
    Par Gobouz dans le forum Visual Studio
    Réponses: 1
    Dernier message: 12/07/2007, 21h32
  3. Ajout nouveaux éléments dans liste de choix
    Par Crazyblinkgirl dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 23/06/2006, 15h17
  4. Réponses: 2
    Dernier message: 05/06/2006, 14h24
  5. [JComboBox] Affichage de nouveaux éléments
    Par GETah dans le forum Composants
    Réponses: 7
    Dernier message: 21/04/2005, 17h56

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