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
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.
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>
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 :
J'ai bien essayé de retirer le cascade="all" d'un ou des 2 mapping mais rien n'y fait.
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());
Je butte dessus depuis ce matin et j'ai la tête qui va exploser bientôt.
Merci d'avance pour vos conseils.
A+
Partager