Ya hemos visto en esta unidad cómo crear relaciones entre objetos y que al definirlas existe el atributo cascade
. Este atributo dispone de 11 posibles valores.
¿Cuál es el significado del atributo cascade? El significado es indicar qué debe hacer hibernate con las clases relacionadas cuando realizamos alguna acción con la clase principal.
Es decir, si borramos la clase principal, ¿debería borrarse la clase relacionada?. La respuesta a ésta y otras preguntas depende de nuestro modelo de clases, por ello existen 11 valores distintos y deberemos elegir entre todos ellos.
Antes de pasar a ver los distintos valores del atributo cascade
veamos unos ejemplos.
Si tenemos las siguientes clases Java:
Es decir que un director pertenece a un centro y este centro tiene un único director. Hagámonos ahora una serie de preguntas:
En este caso el atributo cascade
debería valer save_update
.
Si tenemos las siguientes clases Java:
Es decir que un director reside en un domicilio y el domicilio pertenece a un único director. Hagámonos ahora las mismas preguntas que en caso anterior:
En este caso el atributo cascade
debería tener el valor save_update,delete
.
Si tenemos las siguientes clases Java:
Es decir que un director imparte clases en varios módulos y cada módulo lo imparte un único director 5) hagámonos ahora las siguientes preguntas:
En este caso el atributo cascade
debería valer save_update
.
Si tenemos las siguientes clases Java:
Es decir que un director posee varios correos electrónicos y cada correo electrónico pertenece únicamente a un director. Hagámonos ahora las siguientes preguntas:
En este caso el atributo cascade
debería valor save_update,delete,delete_orphan
.
Veamos ahora cada uno de los posibles valores del atributo cascade
.
Valor | Descripción |
---|---|
none | No se realiza ninguna acción en los objetos relacionados al hacerlo sobre el principal |
save-update | Si se inserta o actualiza el objeto principal también se realizará la inserción o actualización en los objetos relacionados. |
delete | Si se borra el objeto principal también se realizará el borrado en los objetos relacionados. |
evict | Si se llama al método Session.evict(Object objeto) para el objeto principal también se llamará para los objetos relacionados. |
lock | Si se llama al método LockRequest.lock(Object objeto) 10) para el objeto principal también se llamará para los objetos relacionados. |
merge | Si se llama al método Session.merge(Object objeto) con el objeto principal también se llamará para los objetos relacionados. |
refresh | Si se llama al método Session.refresh(Object objeto) para el objeto principal también se llamará para los objetos relacionados. |
replicate | Si se llama al método Session.replicate(Object objeto,ReplicationMode replicationMode) para el objeto principal también se llamará para los objetos relacionados. |
all | Si se realiza cualquiera de las anteriores acciones sobre el objeto principal también se realizará sobre los objetos relacionados. |
delete-orphan | Este atributo sólo se usa si el objeto relacionado es una colección. Indica que si en la colección del objeto principal eliminamos un elemento , al persistir el objeto principal deberemos borrar de la base de datos el elemento de la colección que habíamos eliminado. |
all-delete-orphan | Es la unión de los atributos all y delete-orphan 11) |
De todos los valores los realmente importantes, ya que incluyen la funcionalidad de trabajar con los objetos relacionados, son los 4 siguientes:
none
save-update
delete
delete-orphan
Los siguientes 5 valores generalmente querremos incluirlos ya que no son peligrosos si los inclumos aunque al hacerlo se podrían lanzar más SQL contra la base de datos:
evict
lock
merge
refresh
replicate
Los siguientes 2 valores son agrupaciones de los 9 anteriores:
all
all-delete-orphan
Así que lo normal es que el atributo cascade
tome alguno de los siguientes valores:
none
all
all-delete-orphan
save-update,evict,lock,merge,refresh,replicate