Bonjour,
J'ai une relation 1-n entre une classe A et une classe B. La classe A contient un Set<B>, la classe B ne possède pas de référence vers son parent A (relation 1-n unidirectionnelle). Une cascade all-delete-orphan est définie pour cette relation.
Ci-joint la partie de A.hbm.xml mise en jeu :
Mon problème est le suivant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 <!-- Association 1-n with B --> <set name="bs" cascade="all-delete-orphan"> <key column="A_ID" /> <one-to-many class="B" /> </set>
Lorsque je sauvegarde une instance de A avec un Set<B> rempli, Hibernate réalise, pour chaque élément du Set, un INSERT dans la table correspondant à B. Cet INSERT ne valorise pas la clé étrangère (pointant vers clé primaire de la table A). La valorisation de la clé étrangère s'effectue dans un second temps dans un UPDATE dédié.
Or, afin d'assurer une certaine qualité de données, la clé étrangère de la table B n'est pas nullable, car l'existence d'une instance de B n'a pas de sens si elle n'est pas rattachée à un propriétaire A. Le premier INSERT plante donc.
Avant la série d'INSERT pour les éléments du Set<B>, un INSERT dans la table A correspondant à l'instance de A que je souhaite sauvegarder a bien sûr été effectué.
Avec une relation bidirectionnalle et l'attribut inverse="true", la valorisation de la clé étrangère s'effectue bien dès l'INSERT.
Hibernate n'est-il pas capable de valoriser la clé étrangère dans l'INSERT, même pour une relation unidirectionnelle, comme le ferait une application basique en JDBC ?! Etant donné que l'INSERT dans la table A a déjà été effectué, la valeur de la clé primaire de l'enregistrement de A est connue. Pourquoi Hibernate ne l'insère pas pour valoriser la clé étrangère dans les INSERT suivants pour la table B ?
Partager