2012-05-08 12 views
5

Ho un'applicazione che carica oggetti tramite sospensione e quindi li passa a un altro livello come oggetti distaccati. Qualsiasi modifica a tali oggetti viene rinviata al livello di sospensione dove io chiamo saveOrUpdate() su quegli oggetti.Hibernate salva il metodoOrUpdate elimina i bambini?

Sospende l'eliminazione di oggetti figlio di relazione uno-a-molti contenuti in una raccolta negli oggetti passati in saveOrUpdate() se rimuovo semplicemente l'oggetto figlio dalla raccolta prima di chiamare saveOrUpdate()?

In caso contrario, in che modo questo in genere viene eseguito in un'applicazione di sospensione che utilizza oggetti distaccati?

risposta

5

Sarà hibernate cancellare uno-a-molti oggetti figlio di relazione contenuti in una raccolta negli oggetti che vengono passati in saveOrUpdate() se ho semplicemente rimuovere l'oggetto figlio della collezione prima di chiamare saveOrUpdate()?

No, non per impostazione predefinita. Tali oggetti figlio sono conosciuti come "orfani" in questo contesto, assumendo che qualche altra entità non abbia anche un riferimento ad essi.

Questo è discusso nei documenti, 11.11. Transitive persistence:

Uno stile a cascata speciale, delete-orphan, si applica solo a uno-a-molti associazioni, e indica che l'operazione delete() deve essere applicato a qualsiasi oggetto figlio che viene rimosso dall'associazione. Usando le annotazioni non esiste l'equivalente CascadeType.DELETE-ORPHAN. Invece è possibile utilizzare l'attributo orphanRemoval come mostrato nell'Esempio 11.4, "@OneToMany con orphanRemoval". Se un'entità viene rimossa da una raccolta @OneToMany o un'entità associata viene deinterpretata da un'associazione @OneToOne, questa entità associata può essere contrassegnata per l'eliminazione se orphanRemoval è impostato su true.

+0

Questo ha senso. Tuttavia, quando imposto CascadeType.ALL, orphanRemoval = true sulla raccolta, l'oggetto figlio non viene ancora eliminato. Ciò potrebbe essere dovuto al fatto che sto utilizzando un'annotazione JoinColumn in combinazione con l'annotazione OneToMany? – Tom

+0

@ Tom: Probabilmente no, no, '@ JoinColumn' è appena usato per sovrascrivere il nome della colonna di join predefinito. Sembra che Hibernate non pensi che sia un orfano. Sei sicuro che qualche altra entità non abbia un riferimento a quel bambino? – skaffman

+0

Non è sicuramente referenziato da un'altra entità. La relazione db sottostante è in realtà un ManyToMany, tuttavia, e sto usando OneToMany con JoinColumn per rendere il modello più semplice. Forse lo sta lanciando? Altrimenti ho anche notato che alcune entità figlio del bambino contengono relazioni ManyToOne che non possono avere l'attributo orphanRemoval impostato su di esse. Forse questo sta impedendo la cancellazione del genitore in qualche modo. – Tom

0

Per impostazione predefinita, non lo farà. È possibile utilizzare @Cascade (CascadeType.DELETE_ORPHANS) per ottenere ciò.

Problemi correlati