2009-09-04 10 views
22

Ecco il codice sorgente:Qual è la differenza tra DELETE_ORPHAN e DELETE?

@OneToOne(fetch = FetchType.LAZY) 
@Cascade({SAVE_UPDATE, EVICT, DELETE}) 
@JoinColumn(name = "A_ID", nullable = true) 
private A a; 

@OneToMany 
@Cascade({SAVE_UPDATE, EVICT, DELETE, DELETE_ORPHAN}) 
@JoinColumn(name = "B_ID") 
private List<B> bList; 

Qual è la differenza tra DELETE_ORPHAN e DELETE?

risposta

54

Cascata ELIMINA significa che se questa entità viene eliminata, eliminare l'entità o le entità correlate.

DELETE_ORPHAN significa che un'entità viene rimossa da una raccolta uno-a-molti correlata, quindi non solo la dissocia dall'entità corrente, ma la elimina.

Per fare un esempio, considerare due entità: Casa e Stanza.

ELIMINA nell'elenco Camere su House significa che se si elimina la casa, eliminare tutte le sue stanze.

DELETE_ORPHAN nell'elenco Room in House significa che se si rimuove una stanza da tale raccolta, eliminarla interamente. Senza di esso, la Stanza sarebbe ancora esistente ma non sarebbe attaccata a nulla (quindi "orfana").

In termini di modellazione UML e OO, questa è fondamentalmente la differenza tra composizione e aggregazione. La relazione House-> Room è un esempio di composizione. Una stanza è parte di una casa e non esiste in modo indipendente.

Un esempio di aggregazione è, ad esempio, Class (genitore) a Studente (figlio). Cancellare la classe e lo studente esiste ancora (indubbiamente in altre classi). Rimozione dello studente dalla classe in genere non significa eliminarlo.

+5

FYI: se l'interfaccia per Hibernate è ** JPA **, è possibile farlo con l'attributo 'orphanRemoval = true' nell'annotazione' @ OneToMany' da ** JPA 2.0 **. Vedi http://stackoverflow.com/a/2928481/1029261 – rmoestl

Problemi correlati