Collections d'objet non rafraîchie après une suppression
Bonsoir,
bien que ce problème ait été rencontré quelque fois déjà, je n'ai pas réussi à trouver de solution à mon problème.
Cela paraît simple mais ça ne l'est pas :)
Le problème a lieu lors du rafraîchissement des données après avoir effectué une suppression.
Je vous explique :
1) les données (cf. "msr" pour mesures) sont chargées sur un écran en utilisant le bout de code suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
Criteria preparationPhasesCriteria = this.session.createCriteria(PreparationPhases.class);
preparationPhasesCriteria.createAlias("prpConstructionSite", "cs", JoinType.INNER_JOIN);
preparationPhasesCriteria.addOrder(Order.asc(PreparationPhases.PRP_NUMBER));
java.util.List preparationPhases = preparationPhasesCriteria.list();
for (int i = 0; i < preparationPhases.size(); i++) C
PreparationPhases preparationPhase = (PreparationPhases)preparationPhases.get(i);
// Je rafraîchis mon entité preparationPhase
this.session.refresh(preparationPhase);
// Je parcours la collection des objets "Msrs" rattachés (2 éléments dans mon exemple)
for (Msrs msr : preparationPhase.getMsrs()) {
[ j'affiche mes données ]
}
[...]
} |
2) Je supprime un enregistrement Msrs de ma phase de travail après avoir ouvert une transaction et effectué un commit.
Le changement est bien effectué côté base de données.
3) Lorsque je recharge mon écran, on attend à ce que la collection renvoyée par preparationPhase.getMsrs() ne contienne plus qu'1 élément.
Mais lors du refresh avec :
Code:
this.session.refresh(preparationPhase)
, ma collection n'est pas rafraîchie et l'exception Hibernate est remontée : "org.hibernate.UnresolvableObjectException: No row with the given identifier exists".
Cette exception survient car Hibernate n'a pas réussi à trouver l'élément effacé précédemment.
Petites précisions :
- lorsque un enregistrement Msrs est ajouté, le refresh sur "preparationPhase" remonte bien un élément de plus dans la collection renvoyée par preparationPhase.getMsrs() .
- Voici le code de mon modèle JPA :
Code:
1 2 3 4 5 6 7 8 9
|
private Set<Msrs> msrs;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "msrPreparationPhase",
cascade={CascadeType.REFRESH, CascadeType.DETACH, CascadeType.MERGE, CascadeType.REMOVE})
public Set<Msrs> getMsrs() {
return this.msrs;
} |
Avez-vous une piste à me suggérer ? :roll: