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.
Version imprimable
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.
quel genre d'exception ?
PropertyValueException
Et si je fais l'inverse, c'est-à-dire supprimer d'abord A puis B, j'ai une BatchedTooManyRowsAffectedException :
Code: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:
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); } }
Une âme charitable et éclairée pour m'aider dans ma quête ? :aie:
Salut Verbose!
Je déterre le sujet mais vu que j'ai le même problème, je me demandais si tu avais résolu ton problème et surtout : Comment? Puisque j'imagine que cela doit être le cas! =D
Bonne journée!
Hello,
A mon avis, tu es dans un contexte transactionnel. Cela veux dire que ton objet A n'est pas encore effectivement supprimé en base lorsque tu tentes de supprimer B. Il faut que tu sortes de ta transaction (sortir de l'ejb si tu es sous JEE, ne pas marquer ta méthode @transactionnal si tu es sous spring). avant de supprimer ton deuxieme objet.
Cordialement,