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 :
2) Je supprime un enregistrement Msrs de ma phase de travail après avoir ouvert une transaction et effectué un commit.
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 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 ] } [...] }
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 :
, ma collection n'est pas rafraîchie et l'exception Hibernate est remontée : "org.hibernate.UnresolvableObjectException: No row with the given identifier exists".
Code : Sélectionner tout - Visualiser dans une fenêtre à part this.session.refresh(preparationPhase)
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 :
Avez-vous une piste à me suggérer ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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; }
Partager