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

Vue hybride

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

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

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