C'est une chose (dont je me souviens) dans laquelle je suis tombé quand j'étais dans mes jours d'hibernation. Lorsque vous supprimez (plusieurs) objets enfants d'une collection (dans une entité parent) et que vous ajoutez ensuite de nouvelles entités à la même collection en une seule transaction sans vidange au milieu, Hibernate effectuera l'"insertion" avant la "suppression". Si la table enfant a une contrainte unique dans l'une de ses colonnes, et que vous pensez que vous ne la violerez pas puisque vous avez déjà supprimé des données auparavant (comme moi), préparez-vous à être frustré. Le forum Hibernate le suggère :
- C'était un défaut de conception de la DB, une nouvelle conception ;
- flush (ou commit si vous voulez) entre les suppressions et les insertions ;
Je ne pouvais pas faire les deux, et j'ai fini par modifier le code source d'Hibernate et le recompiler. Il ne s'agissait que d'une ligne de code. Mais l'effort pour trouver cette ligne a représenté environ 27 tasses de café et 3 nuits blanches.
Il ne s'agit là que d'un exemple des problèmes et des bizarreries que vous pouvez rencontrer lorsque vous utilisez Hibernate sans véritable expert dans votre équipe (expert : personne ayant une connaissance suffisante de la philosophie et du fonctionnement interne d'Hibernate). Votre problème, votre solution, votre nombre de litres de café et de nuits blanches peuvent varier. Mais vous comprenez l'idée.