2011-12-19 24 views
8

He heredado una base de código en el que casi todas las relaciones tienen las siguientes anotaciones:cascada de JPA = REMOVE y Hibernate @OnDelete utilizados juntos?

@OneToMany(fetch = FetchType.LAZY, cascade = { CascadeType.REMOVE }, mappedBy = "someThing") 
@OnDelete(action = OnDeleteAction.CASCADE) 

Ahora estoy teniendo problemas para entender lo que hace @OnDelete en el primer lugar. Hibernate: OnDelete vs cascade=CascadeType.REMOVE es interesante, pero desafortunadamente no tiene ninguna respuesta y JavaDoc para @OnDelete es particularmente inútil.

De las otras preguntas parece que la anotación OnDelete permite de alguna manera que el DB haga la cascada, mientras que la directiva en cascada en @OneToMany permite que la ORM lo haga, pero ¿cuál sería el propósito de usarlas juntas?

¿Y la directiva en cascada de @OneToMany realmente no permite que la implementación de ORM genere una cascada basada en DB de todos modos?

Respuesta

8

Digamos que usted tiene una relación direccional uno-a-uno

class House { 

    @OneToOne 
    Object door; 

} 

Si utiliza CascadeType.REMOVE a continuación, eliminar la casa también eliminará la puerta.

@OneToOne(cascade=CascadeType.REMOVE) 
    Object door; 

Si usa @OnDelete, al eliminar la puerta también se eliminará la casa.

@OneToOne 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    Object door; 

Leer más aquí: http://www.ninthavenue.com.au/jpa-cascadetype-remove-vs-hibernate-ondelete

+2

El comportamiento con un '@ OneToOne' y una' no parece @ OneToMany' a ser lo mismo. Con '@OneToMany (...) @OnDelete (action = OnDeleteAction.CASCADE) Object doors', parece que eliminar la casa borra todas sus puertas, pero eliminar una puerta no elimina la casa. – Bruno

+0

Tendría que ser '@OneToMany List doors', creo. Pero además de eso, este mapeo normalmente no crearía una columna en la mesa de la Casa. Tendría un mapeo inverso en 'Doors.house', o una tabla de colección. Para la cascada de bases de datos, creo que la columna debe estar en la tabla en la que desea conectarse en cascada. –

+0

No estoy de acuerdo. Creo que la mayor diferencia entre '' 'CascadeType.REMOVE''' y' '' @ OnDelete''' en la vista del usuario es que '' '@ OnDelete''' puede funcionar con JPAQL (ya que está basado en DB cascada), pero '' 'CascadeType.REMOVE''' no puede funcionar con JPAQL. – okwap

Cuestiones relacionadas