2010-04-26 2 views
3

Considérez l'association suivante livre a chapitres OneToManyMise en veille prolongée - contrôle d'insertion et de mise à jour des requêtes

Si j'Execute:

session.save(book) 
session.save(chapter) 
session.getTransaction().commit() 

Hibernate génère requête d'insertion pour livre et insérer la requête pour le chapitre

Mais si j'exécute:

session.save(chapter) 
session.save(book) 
session.getTransaction().commit() 

Hibernate exécute une requête d'insertion pour le chapitre, insère une requête pour le livre et met à jour la requête pour le chapitre.

Y at-il un moyen de le faire dans 2 insertions au lieu de 2 insertions et 1 mise à jour? (Supposons que la génération de clé primaire est similaire à l'identité et Chapter.Book est annulable)

+1

Pourriez-vous afficher votre correspondance et le code dans lequel vous initialisez le chapitre? (Je suppose que vous avez un @OneToMany de livre à chapitre, mais est-il bidirectionnel? Quel côté est le propriétaire de l'association? Comment définissez-vous l'association en ajoutant un chapitre au livre ou en plaçant le livre dans le chapitre?) – Thierry

Répondre

4

C'est parce que vous avez probablement Book 1..n Chapter, avec cascade ensemble à (au moins) PERSIST. Ce qui signifie que chaque fois qu'un livre est sauvegardé, tous ses chapitres sont également sauvegardés.

Vous tentez donc d'enregistrer deux fois les chapitres. Vous n'avez pas besoin 2ème sauvegarde (dans le 2ème exemple)

Le premier exemple fonctionne de cette façon parce que le chapitre est devenu associé à la session (peut-être vous n'avez pas les méthodes de substitution hashCode() et equals()), et le save() ne fait rien du tout.

Mais ce ne sont que des conjectures. Vous devriez montrer vos cartographies.

+0

Vous êtes explication ne fonctionne pas pour le premier exemple: livre est enregistré (avec ses chapitres s'il y a une cascade), puis le chapitre devrait être enregistré une autre fois avec votre explication, générant également une mise à jour. Ce n'est pas ce qui se passe. Dans le second exemple, je suppose que la première sauvegarde d'un chapitre n'enregistre pas le lien vers le livre. La mise à jour est ensuite générée pour définir le lien (une fois que Hibernate connaît l'ID du livre). – Thierry

+0

c'est le cas, voir ma mise à jour – Bozho

Questions connexes