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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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