La question est dans le titre. Comment détacher un objet de la session ?
Plus précisément, j'ai récupéré une grappe d'objets A et de sous-objet B. Or je voudrais pouvoir supprimer A sans supprimer B.
La question est dans le titre. Comment détacher un objet de la session ?
Plus précisément, j'ai récupéré une grappe d'objets A et de sous-objet B. Or je voudrais pouvoir supprimer A sans supprimer B.
Si tu n'as pas précisé de stratégie de cascade, supprimer tes A ne devraient pas supprimer tes B.
Je n'ai précisé aucune stratégie de cascade.
Le problème que je rencontre est que dans certains cas, je dois supprimer A et B, et dans certains cas, seulement A.
Or, lorsque je veux supprimer A et B, je supprimer d'abord B, et j'ai une Exception à la suppression de A.
PropertyValueException
Et si je fais l'inverse, c'est-à-dire supprimer d'abord A puis B, j'ai une BatchedTooManyRowsAffectedException :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Batch update returned unexpected row count from update [0]; actual row count: 13; expected: 1
Je pense que la dernière exception (BatchedTooManyRowsAffectedException) vient du fait que les sous-objets B peuvent être partagé par les instances de A. C'est-à-dire que plusieurs instances de A peuvent référencer le même sous-objet B (ou du moins des objets B ayant le même identifiant unique).
Voici mon code :
La méthode detacher() appelle Session.evict().
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 for (A action : list) { B suivi = action.getB(); dao.detacher(suivi); dao.supprimer(action); if (suivi != null && aSupprimer.remove(suivi)) { dao.mettreAJour(suivi); dao.supprimer(suivi); } }
Partager