Bonjour,

Nous rencontrons un problème auquel nous ne trouvons pas de solution.

Soit un Beneficiaire ayant un set de RessourceRGAL :




Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
public class Beneficiaire extends BaseBean
{
...
private Set<RessourceRGAL> lesRessourceRGAL = new HashSet<RessourceRGAL>();
 
}
Pour le mapping, c'est une relation One-To-Many :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
<hibernate-mapping package="bean.beneficiaire" default-lazy="true" default-cascade="none">
<class optimistic-lock="version" table="beneficiaire_bene" name="Beneficiaire">
 
...
<set name="lesRessourceRGAL" table="ressourcergal_rrga">
<key foreign-key="fk_rrga_bene_1" >
<column name="bene_id_lesressourcergal" index="in_rrga_5" not-null="false" ></column>
</key>
<one-to-many class="bean.RessourceRGAL" />
</set>

Lorsque nous lisons la collection, nous appliquons une ou plusieurs restrictions, par exemple pour ne lire que les "lesRessourceRGAL" d'une année particulière.
Du coup, la collection n'est pas complète.

Dans le cas où on n'a lu que 2018 et que la collection ne comporte qu'un seul objet :
- si on supprime cet objet de la collection : unBeneficiaire.getlesRessourceRGAL().remove(unRessourceRGAL)
- et qu'on synchronise le base : saveorupdate(unBeneficiaire)
==> Hibernate va générer le sql suivant :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
update
ressourcergal_rrga
set
bene_id_lesressourcergal=null
where
bene_id_lesressourcergal=?
Du coup, les RessourceRGAL des années précédentes seront orphelines.

Le même problème se pose la lecture initiale ne retourne rien :
Car alors on fait un : unBeneficiaire.setLesRessourceRGAL(new HashSet<RessourceRGAL>());
Si ensuite on synchronise le base : saveorupdate(unBeneficiaire)
Hibernate va générer le même sql que ci-dessus.


Il y a t-il une solution ?
Merci pour vos lumières!

Cordialement,
Thomas