Bonjour,
J'ai dans mon application plusieurs relations de type 1..*, chose courante.
Notons les classes : [A] 1______________* [B]
Ma base de données contient donc une table A(idA), et une table B(idB, idA_Pere), avec une contrainte not null sur IdA_Pere.
Si j'ai bien compris la doc d'Hibernate 3 (en anglais), il semblerait qu'il soit conseillé de mapper le père (A) dans l'entité B. Ce qui donne dans B.hbm :
Code:
<many-to-one name="papaA" column="idA_Pere" unique="true" not-null="true">
Du coup, si je veux pouvoir récupérer tous mes fils depuis A, il me faut faire un mapping bidirectionnel. Donc dans A.hbm :
Code:
<set name="filsB" table="B">
<key column="idA_Pere">
<one-to-many class="B">
</set>
Ma problématique vient surtout de l'ajout d'un nouveau fils (B) rattaché à son père (A), puisque la clé étrangère est not null.
Deux approches sont envisageables (on suppose que A existe déjà) :
1. Je crée mon instance de B à laquelle j'attache mon instance père de A, puis je fais un save de cette instance.
=> Cette approche-ci fonctionne, mais n'est pas très élégante pour la mise à jour de la liste des fils dans A (il faut faire des load systématiques).
2. Je crée mon instance de B sans y rattacher de père (on ne le mappe pas). J'ajoute cette instance dans la collection des fils de A, puis je fais un save de A.
=> Cette approche semble ne pas fonctionner. En effet, je récupère une exception pas très claire :
Quote:
org.hibernate.StaleStateException: Batch update returned unexpected row count from update: 0 actual row count: 0 expected: 1
Il semblerait qu'Hibernate ne soit pas capable de créer l'instance de B à partir du fait qu'elle existe dans la collection des fils de A. Ou peut-être que mon mapping n'est pas correct.
J'ai longuement lu la documentation, les forums, etc. La documentation semble nous pousser à utiliser l'approche n°1. Pourtant, je pense que l'approche 2 est beaucoup plus simple sur le plan sémantique et algorithmique.
Je conclurai donc ce post sur 2 questions simples :
1) Hibernate ne serait-il donc pas capable de traiter l'approche numéro 2 ?
2) Quelle solution de mapping est donc la plus adaptée à ce genre de situation ?
Merci d'avance pour votre aide.
Cordialement,
Frédéric MONJO,
Chef du projet IceScrum.