2009-09-04 18 views
22

Aquí está el código fuente:¿Cuál es la diferencia entre DELETE_ORPHAN y 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; 

¿Cuál es la diferencia entre DELETE_ORPHAN y DELETE?

Respuesta

54

Cascade DELETE significa que si se elimina esta entidad, elimine la o las entidades relacionadas.

DELETE_ORPHAN significa que si una entidad se elimina de una colección relacionada de uno a muchos, no solo la desasocia de la entidad actual, sino que la elimina.

Para darle un ejemplo, considere dos entidades: Casa y Habitación.

ELIMINAR en la lista de habitaciones en Casa significa que si borra la Casa, borre todas sus Habitaciones.

DELETE_ORPHAN en la lista de habitaciones en Casa significa que si elimina una Habitación de esa colección, elimínela por completo. Sin él, la Habitación todavía existiría, pero no se adjuntaría a nada (de ahí "huérfano").

En términos de modelado UML y OO, esta es básicamente la diferencia entre composición y agregación. La relación Casa-> Habitación es un ejemplo de composición. Una habitación es parte de una casa y no existe de manera independiente.

Un ejemplo de agregación es, por ejemplo, Class (parent) para Student (child). Eliminar la clase y el estudiante todavía existe (sin duda en otras clases). Eliminar al estudiante de la clase normalmente no significa eliminarlo.

+5

FYI: si su interfaz para Hibernate es ** JPA **, puede lograr eso con el atributo 'orphanRemoval = true' en la anotación' @ OneToMany' desde ** JPA 2.0 **. Ver http://stackoverflow.com/a/2928481/1029261 – rmoestl

Cuestiones relacionadas