Lorsque je que fais un saveOrUpdate d'un objet et que ma base de données (H2) a déjà un objet avec cet identifiant, je voudrais que les fils présents en DB soient remplacés par les fils du nouvel objet et je n'y arrive pas : les anciens objets fils ne sont pas supprimés.
Extraits:
<hibernate-mapping>
<class name="mush.MushGame" table="MUSH_GAME">
<id name="id" column="GAME_ID">
<generator class="assigned" />
</id>
<set name="persos" inverse="true" cascade="all-delete-orphan">
<key column="GAME" />
<one-to-many class="mush.Perso" />
</set>
</class>
</hibernate-mapping>
<hibernate-mapping>
<class name="mush.Perso" table="PERSO_RESULT">
<id name="id" column="PERSO_RESULT_ID">
<generator class="increment" />
</id>
<many-to-one name="game" class="mush.MushGame" column="GAME" not-null="true" />
<property name="nom" />
</class>
</hibernate-mapping>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 package mush; public class MushGame { private Long id; private Set<Perso> persos; }
Note:
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package mush; public class Perso implements Comparable<Perso> { private Long id; private String nom; private MushGame game; public int compareTo(Perso o) { return this.nom.compareTo(o.nom); } public boolean equals(Object o) { if (this == o) return true; if (o == null) return false; if (o instanceof Perso) { Perso c = (Perso) o; if (this.nom == c.nom) return true; if (this.nom == null || c.nom == null) return false; return (this.nom.equals(c.nom)); } else { return false; } } //[...] Juste un petit extrait du code... }
J'utilise "assigned" pour la classe Mush parce que cet ID est conceptuellement un lien vers une entité externe à mon programme. (Pensez datamining, en utilisant cet ID, je peux retrouver les données sources que mon programme analyse en enrichit)
Concrètement, je souhaiterais donc que lorsque je crée (avec new) un objet mushgame avec un identifiant choisi (par exemple 3000l) et que je le persiste ensuite par un session.saveOrUpdate , les lignes de la table PERSO_RESULT avec 3000l dans la colonne "GAME" soient supprimées et remplacées par le contenu du champ "persos" de l'instance MushGame que j'ai créé.
Des idées ?
Partager