2013-08-21 9 views

risposta

14

Senza codice di destinazione mapping è un po 'difficile ... Questo è causato, di solito, perché si sta eliminando un oggetto associato a una raccolta.
È necessario rimuovere l'oggetto da possedere collezione (s) e, dopo, cancellare oggetto

parentObject.collection.remove(objToDelete); 
session.delete(objToDelete); 
session.save(parentObject); 

Ma si può evitare questo utilizzando deleteOrphan alla raccolta mappato in questo modo

class ParentObject { 
    @OneToMany(orphanRemoval=true) 
    private List<ChildObject> collection; 
} 

e il codice si presenta come

parentObject.collection.remove(objToDelete); 
session.save(parentObject); 

non si più oggetto necessità cancellazione in quanto viene rimosso automaticamente da Hibernate durante il salvataggio ParentObject.

La speranza può aiutare

+1

gli utenti di ibernazione dovrebbero utilizzare questo per la rimozione di orfani @Cascade ({org.hibernate.annotations.CascadeType.DELETE_ORPHAN}) – Akhilesh

5

Hai cancellato un soggetto (A) nella sessione, ma fa riferimento a un'altra entità e viene anotated con un'annotazione Cascade. Tale riferimento farebbe reagire immediatamente l'entità (A). Dal momento che questo probabilmente non è ciò che intendevi, il letargo si lamenta.

La soluzione è trovare tutti i riferimenti (comprese le raccolte) tramite i quali l'entità è raggiungibile e impostarli su null/rimuovere l'entità dalla raccolta.

È possibile attivare la logica di eliminazione in giro: creare il riferimento (se ce n'è uno solo) a delete orphan e semplicemente rimuoverlo lì come descritto @bellabax.

2

Questa eccezione indica che l'oggetto che si sta eliminando viene mappato anche con la raccolta di qualsiasi entità e la cascata in quell'identificativo di raccolta tutto. Quindi, se si desidera eliminare alcun modo si può cambiare la vostra cascata

cascade = CascadeType.DETACH 
0

Se si sta facendo questo tramite XML (e non le annotazioni), qui di seguito è una soluzione che ha funzionato per me:

One-to Associazioni -Molti:

  1. Rimuovere qualsiasi collegamento dell'oggetto bambino da eventuali raccolte nell'oggetto genitore [NOTA: Se si sta facendo One-to-One associazione, appena impostare il riferimento all'oggetto bambino in oggetto padre a "null"]
  2. Eliminare l'oggetto figlio dal database
  3. a filo le modifiche utilizzando session.flush()
  4. link l'oggetto padre per il nuovo oggetto figlio
  5. Salva l'oggetto padre 6) impegnano i cambiamenti

ATTENZIONE: sessione.flush() è importante in quanto Hibernate deve vedere le modifiche,

Se non si riesce a svuotare la sessione, ti consiglio di eseguire i passaggi (1,2) in una transazione diversa e quindi eseguire i passaggi (4,5, 6) in una nuova transazione.

Problemi correlati