Hibernate 3
Oracle XE
Bonjour, mon problème est que je n'arrive pas à sauvegarder dans la base des objets contenant des listes lorsque la relation est * * (many-to-many). J'ai à chaque fois une violation de contrainte de clé étrangère dans la table intermédiaire.
Voici la partie qui nous intéresse de mon fichier de mapping
(Country contient une liste de Vaccine, la relation est * *)
Code:
<bag name="vaccineList" cascade="save-update">
<key column="country_id"/>
<many-to-many column="vaccine_id" class="applicationServer.NGModel.geography.Vaccine"/>
</bag>
Voici mon code (country1 et country2 sont correctement instanciés et contiennent bien une liste)
Code:
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
session.save(NGModelInstances.country1);
session.save(NGModelInstances.country2);
session.getTransaction().commit();
HibernateUtil.getSessionFactory().close();
Et enfin voici l'erreur que j'obtient:
Code:
Hibernate: select max(id) from COUNTRY
Hibernate: insert into COUNTRY (NAME, VISA, id) values (?, ?, ?)
Hibernate: insert into COUNTRY (NAME, VISA, id) values (?, ?, ?)
Hibernate: update AREA set ACREAGE=?, NATURAL_RESERVE=?, ACCESS_WAY=? where id=?
Hibernate: update AREA set ACREAGE=?, NATURAL_RESERVE=?, ACCESS_WAY=? where id=?
Hibernate: update VACCINE set NAME=? where id=?
Hibernate: update VACCINE set NAME=? where id=?
Hibernate: update AREA set ACREAGE=?, NATURAL_RESERVE=?, ACCESS_WAY=? where id=?
Hibernate: update AREA set ACREAGE=?, NATURAL_RESERVE=?, ACCESS_WAY=? where id=?
Hibernate: update VACCINE set NAME=? where id=?
Hibernate: update PRESENCE_FREQUENCIES set area_id=null, sort_order=null where area_id=?
Hibernate: update PRESENCE_FREQUENCIES set area_id=null, sort_order=null where area_id=?
Hibernate: update PRESENCE_FREQUENCIES set area_id=null, sort_order=null where area_id=?
Hibernate: update PRESENCE_FREQUENCIES set area_id=null, sort_order=null where area_id=?
Hibernate: update AREA set country_id=? where id=?
Hibernate: update AREA set country_id=? where id=?
Hibernate: insert into vaccineList (country_id, vaccine_id) values (?, ?)
Hibernate: insert into vaccineList (country_id, vaccine_id) values (?, ?)
10:23:31,312 WARN JDBCExceptionReporter:71 - SQL Error: 2291, SQLState: 23000
10:23:31,312 ERROR JDBCExceptionReporter:72 - ORA-02291: violation de contrainte d'intégrité (VLAD.FK27A055F345B9BA0F) - clé parent introuvable
10:23:31,312 WARN JDBCExceptionReporter:71 - SQL Error: 2291, SQLState: 23000
10:23:31,312 ERROR JDBCExceptionReporter:72 - ORA-02291: violation de contrainte d'intégrité (VLAD.FK27A055F345B9BA0F) - clé parent introuvable
10:23:31,328 ERROR AbstractFlushingEventListener:300 - Could not synchronize database state with session
A noté que dans cet exemple j'ai tenté la génération en cascade, celà ne fonctionne pas mieux si j'enregistre à l'avance mes instances de vaccine contenu dans les listes et que j'enlève cascade.
Quelqu'un voit il comment se débarasser de cette violation de contrainte (sans utiliser lazy bien sur, j'ai besoin que mon instance country enregistre ses listes dans la base) ?
Question subsidiaire : Pourquoi lorsque j'utilise cascade, hibernate me fait des opérations d'update sur les éléments de la liste au lieu de faire des insert dans les tables (qui sont vides à ce moment là).
Merci à ceux qui prendront de leur temps pour me venir en aide !!! ;-)