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 :

[Hibernate] many-to-many et transaction


Sujet :

Hibernate Java

  1. #1
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut [Hibernate] many-to-many et transaction
    Bonjour à tous !

    Avant de venir poster ici, j'ai bien regardé tous les sujets "many-to-many" pour Hibernate mais je ne trouve ni la solution ni une personne ayant les mêmes problèmes que moi.

    J'explique un peu le contexte. J'ai deux tables PROCEDURE et OBJET avec une relation ** bi-directionnelle entre les deux.
    j'ai donc fait un mapping de ces deux classes avec un many-to-many

    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
    <class name="bo.patrimoine.Objet" table="OBJET">
            <id name="idObjet" type="int">
                <column name="IDOBJET"/>
                <generator class="increment" />
            </id>
    		<set name="procedures" table="RELATION_OBJET_PROCEDURE" cascade="all">
               <key column="IDOBJET"/>
               <many-to-many column="IDPROCEDURE" class="bo.patrimoine.Procedure"/>
    		</set>
        </class>
     
    <class name="bo.patrimoine.Procedure" table="PROCEDURE">
            <id name="idProcedure" type="int">
                <column name="IDPROCEDURE"/>
                <generator class="increment" />
            </id>
    		<set name="objets" table="RELATION_OBJET_PROCEDURE" cascade="all">
               <key column="IDPROCEDURE"/>
               <many-to-many column="IDOBJET" class="bo.patrimoine.Objet"/>
    		</set>
        </class>
    Mon soucis est que je ne peux pas créer de nouveaux liens entre ces deux tables, lorsque j'ajoute un OBJET à un PROCEDURE et que je sauvegarde (+ commit) la collection se vide et je n'ai aucun nouvel enregistrement en BDD.
    Plus fort, lorsque j'ai déjà un lien entre un OBJET et une PROCEDURE, que je charge cette PROCEDURE et que je fais un update (sans rien touché d'autre), la collection se vide aussi et supprime mon lien en BDD !
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    HibernateUtil.currentSession();
    		Transaction tx = HibernateUtil.currentSession().beginTransaction();
    		Procedure procedure = (Procedure)HibernateUtil.currentSession().createQuery("from Procedure where idProcedure=1").uniqueResult();
    		System.out.println(procedure.getObjets().size());
    		HibernateUtil.currentSession().saveOrUpdate(procedure);
    		tx.commit();
    		System.out.println(procedure.getObjets().size());
    J'ai bien essayé de retirer le cascade="all" d'un ou des 2 mapping mais rien n'y fait.
    Je butte dessus depuis ce matin et j'ai la tête qui va exploser bientôt.

    Merci d'avance pour vos conseils.
    A+

  2. #2
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    t'aurais pas oublié le 'inverse="true" sur une de tes deux relation, afin de préciser à hibernate quel coté de la relation se charge de la maintenir?

  3. #3
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut
    Oups j'avais oublié de préciser que j'avais aussi essayer (d'un côté comme de l'autre) mais que rien ne faisait.

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    que donne le sql généré pour ton code (show_sql=true dans hibernate)

  5. #5
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut
    Je ne l'ai pas ici avec moi mais ce dont je me souviens c'est qu'aucun insert n'était lancé vers ma table d'association seule un insert de mise à jour de ma PROCEDURE.
    La question est :
    est-ce qu'hibernate essai d'insérer mais ne détecte rien et donc ne lance pas d'insert
    ou bien est-ce qu'hibernate ne lance pas la MAJ de l'association.

    Demain dès la première heure je mettrai le sql d'hibernate

  6. #6
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    normalement, si tu touche pas le set, il ne fait ni ajout ni suppression. Si tu touche le set d'un manière ou d'une autre, il va faire un remove de tout ce qui était dedans à l'origine puis un add de ce qui est maintenant dedans.

    Est-il possible que tu aie, coté DB, une sorte d'auto incrément sur ta table qui ferait que ton id procédure change à chaque update? Ce qui expliquerais la mystérieuse disparition de la relation.

  7. #7
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut
    Re,
    De bon matin j'ai tripatouiller le log4j.properties et autorisé les system.out de DEBUG et là hooo grande surprise c'est hibernate qui supprime mes enregistrements avec deux beaux

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    08:15:36,890 DEBUG SQL:401 - delete from PATRIMOINE.RELATION_OBJET_PROCEDURE where IDPROCEDURE=?
    Hibernate: delete from PATRIMOINE.RELATION_OBJET_PROCEDURE where IDPROCEDURE=?
    08:15:36,890 DEBUG SQL:401 - delete from PATRIMOINE.RELATION_OBJET_PROCEDURE where IDOBJET=?
    Hibernate: delete from PATRIMOINE.RELATION_OBJET_PROCEDURE where IDOBJET=?
    Pour répondre à tchize_, apparemment ce n'est pas du côté de ma BDD mais bien d'hibernate ....

    Edit :
    Nouveauté même lorsque je supprime le saveOrUpdate() de ma procedure, et bien hibernate lance tout de même les delete. Je n'y comprend plus rien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    HibernateUtil.currentSession();
    		Transaction tx = HibernateUtil.currentSession().beginTransaction();
    		Procedure procedure = (Procedure)HibernateUtil.currentSession().createQuery("from Procedure where idProcedure=1").uniqueResult();
    		System.out.println(procedure.getObjets().size());
    		tx.commit();
    		System.out.println(procedure.getObjets().size());

  8. #8
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 483
    Par défaut
    a mon avis c'est un autre code qui fait tes delete, je vois pas d'autre raison. met un log au début et à la fin de ta transaction pour t'en assurer. Il n'y a aucune raison que hibernate fasse un delete lors d'un select. Pense aussi a faire un flush() de ta session avant de commencer ta transaction ainsi qu'un autre flush() juste avant son commit.

  9. #9
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut
    J'avais oublier d'implémenter les méthodes equals et hashcode. Mais pour l'instant j'ai encore des erreurs org.hibernate.LazyInitializationException: illegal access to loading collection
    Je recontacte après réparation.

  10. #10
    Membre éclairé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Juin 2007
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2007
    Messages : 70
    Par défaut
    Voilà c'est réparé et ça marche nikel
    La solution est de ne pas oublier de surcharger les méthodes equals et hashcode pour les set.
    A ne pas oublier non plus le inverse="true".

    Un grand merci à tchize_ pour son aide et sa patience.
    Bon courage à tous.

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

Discussions similaires

  1. Hibernate Relations Reflexives Many-to-Many
    Par Shiingo dans le forum Hibernate
    Réponses: 6
    Dernier message: 14/09/2007, 16h57
  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, 19h50
  3. [hibernate 3] mapping many-to-many
    Par darkyspirit dans le forum Hibernate
    Réponses: 4
    Dernier message: 29/12/2006, 20h37
  4. [Hibernate] delete sur un many-to-many
    Par Gob4 dans le forum Hibernate
    Réponses: 1
    Dernier message: 10/05/2006, 17h26
  5. [hibernate]relation many-to-many
    Par quilo dans le forum Hibernate
    Réponses: 5
    Dernier message: 20/12/2005, 11h07

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