Bonjour,
Je suis confronté à un problème que je n'arrive vraiment pas à résoudre même en bidouillant mon code dans tous les sens
J'ai un objet A qui contient une collection d'objet B
Mon mapping est le suivant :
Ce mapping fonctionne plutot bien
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 <hibernate-mapping package="bidule"> <class name="A" table="A" lazy="false"> <id name="id" column="A_ID" type="long"> <generator class="native"> <param name="sequence">SEQ_A</param> </generator> </id> <bag name="collectionDeB" table="B" lazy="true"> <key> <column name="A_ID"/> </key> <one-to-many class="bidule.B" /> </bag> </class> </hibernate-mapping>
Mon problème est le suivant :
Je crée un objet A (sans collection d'objet B)
Puis, dans une autre page de mon appli, je crée un objet B faisant référence à l'objet A précédement créé
Je sauvegarde mon objet B, je retourne sur mon objet A que je sauvegarde sans ajouter aucune modif
Et là, j'ai un jolie message d'erreur qui me dis :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 Caused by: java.sql.BatchUpdateException: ORA-01407: impossible de mettre à jour ("Ma_BASE"."B"."A_ID") avec NULL at oracle.jdbc.driver.DatabaseError.throwBatchUpdateException(DatabaseError.java:343) at oracle.jdbc.driver.OraclePreparedStatement.executeBatch(OraclePreparedStatement.java:10656) at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeBatch(NewProxyPreparedStatement.java:1723) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246)
En faisant un peu de débug, j'ai pu me rendre compte qu'avant d'enregistrer mon objet A pour la dernière fois, la collection de B de cette objet est vide alors que j'ai créé un objet B précédement....
Je pense que le pb vient de là... En effet, en tentant d'enregistré mon objet A, hibernate voit en base l'objet B lié à mon objet A et tente de le mettre à jour avec un id NULL.... (Pure hypothèse, mais j'en suis à ce stade)
J'ai tenté de forcer le chargement de ma collection de B à l'aide de :
Mais pas mieux....
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 Hibernate.initialize(A.getCollectionDeB());
J'ai essayé de charger les objets B depuis la base et de les affecters à mon objets A avant l'enregistrement, mais là, j'ai une erreur me disant qu'un objet avec le même identifiant est déjà en session.....
Je sais pas trop comment m'en sortir...
Si quelqu'un a une idée, je suis vraiment preneur !!!!!!!
Merci d'avance !
Partager