Tabla de Contenidos
Cascade
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.
Ejemplos
Antes de pasar a ver los distintos valores del atributo cascade
veamos unos ejemplos.
Director-Centro
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:
- ¿Si borramos el director deberíamos borrar también el centro? NO
- ¿Si actualizamos el director deberíamos actualizar también el centro 1)? SI
- ¿Si insertamos el director deberíamos insertar también el centro 2)? SI
En este caso el atributo cascade
debería valer save_update
.
Director-Direccion
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:
- ¿Si borramos el director deberíamos borrar también el domicilio? SI
- ¿Si actualizamos el director deberíamos actualizar también el domicilio 3)? SI
- ¿Si insertamos el director deberíamos insertar también el domicilio 4)? SI
En este caso el atributo cascade
debería tener el valor save_update,delete
.
Director-Modulo
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:
- ¿Si borramos el director deberíamos borrar también todos los módulos? NO
- ¿Si actualizamos el director deberíamos actualizar también los módulos 6)? SI
- ¿Si insertamos el director deberíamos insertar también los módulos 7)? SI.
- ¿Si borramos algún módulo de las lista deberíamos borrar dicho módulo? NO
En este caso el atributo cascade
debería valer save_update
.
Director-CorreoElectronico
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:
- ¿Si borramos el director deberíamos borrar también todos los correos electrónicos? SI
- ¿Si actualizamos el director deberíamos actualizar también los correos electrónicos8)? SI
- ¿Si insertamos el director deberíamos insertar también los correos electrónicos9)? SI.
- ¿Si borramos algún correo electrónico de las lista deberíamos borrar dicho correos electrónicos? SI
En este caso el atributo cascade
debería valor save_update,delete,delete_orphan
.
Valores
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