Many-to-many cascaded relationship
Giusto per cominciare...
Oggi ho avuto modo di scontrarmi con le relazioni molti-a-molti di Hibernate e nello specifico con la clausula cascade.
Ho potuto sperimentare che nelle relazioni molti-a-molti, diciamo tra User e Group del modulo auth, avevo utilizzato la clausula cascade in maniera errata.
Ritenevo che, volendo eliminare anche la riga dalla tabella di relazione, group_user nello specifico, quando eliminavo un utente dovevo specificare sulla relazione la clusula cascade="delete": niente di più errato!
Specificando cascade="delete" ottengo un effetto quanto mai caustico: eliminando l'utente elimino anche il gruppo!
Aggiungeteci poi che la stessa clausula era specificata sulla relazione inversa (da gruppo ad utente e sempre per la stessa ragione) ho ottenuto che cancellando l'utente sono riuscito a cancellare il gruppo e tutti gli utenti che appartenevano a quel gruppo e tutti gli altri gruppi associati a ciascun utente... e così via a cascata! Con un delete mi sono ritrovato con tutti gli utenti eliminati!
Nel mio caso era sufficiente rimuovere l'utente da tutti i gruppi e poi cancellare l'utente per effettuare l'operazione che desideravo. Vorrei farvi notare che la rimozione dell'utente dai gruppi è necessaria solo perchè la relazione da utente a gruppo è definita come inversa.
Oggi ho avuto modo di scontrarmi con le relazioni molti-a-molti di Hibernate e nello specifico con la clausula cascade.
Ho potuto sperimentare che nelle relazioni molti-a-molti, diciamo tra User e Group del modulo auth, avevo utilizzato la clausula cascade in maniera errata.
Ritenevo che, volendo eliminare anche la riga dalla tabella di relazione, group_user nello specifico, quando eliminavo un utente dovevo specificare sulla relazione la clusula cascade="delete": niente di più errato!
Specificando cascade="delete" ottengo un effetto quanto mai caustico: eliminando l'utente elimino anche il gruppo!
Aggiungeteci poi che la stessa clausula era specificata sulla relazione inversa (da gruppo ad utente e sempre per la stessa ragione) ho ottenuto che cancellando l'utente sono riuscito a cancellare il gruppo e tutti gli utenti che appartenevano a quel gruppo e tutti gli altri gruppi associati a ciascun utente... e così via a cascata! Con un delete mi sono ritrovato con tutti gli utenti eliminati!
Fate quindi molta attenzione: la clausola cascade ha effetto sugli elementi della relazione, non sulle associazioni che vengono già rimosse per default!
Nel mio caso era sufficiente rimuovere l'utente da tutti i gruppi e poi cancellare l'utente per effettuare l'operazione che desideravo. Vorrei farvi notare che la rimozione dell'utente dai gruppi è necessaria solo perchè la relazione da utente a gruppo è definita come inversa.
1 Comments:
A quanto detto sopra vorrei aggiungere che c'è un altro caso in cui è necessario rimuovere l'utente da tutti i gruppi, cioè quando da gruppo ad utente è stata stabilita una relazione di cascade diversa da none altrimenti Hibernate si ritrova con un oggetto da salvare in cui è presente un oggetto da eliminare... e naturalmente non sa più cosa fare.
Questo errore è segnalato come "deleted object would be re-saved by cascade".
By Gaetano Perrone, at 5:33 PM
Posta un commento
<< Home