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:

PlantUML Graph

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:

PlantUML Graph

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:

PlantUML Graph

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:

PlantUML Graph

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

1) , 3) , 6) , 8) si ha cambiado algo
2) , 4) si no existe
5) queda un poco raro pero creo que así se entiende el ejemplo
7) , 9) si no existen
11) En el autocompletado del XML en netbeans no ofrece como opción este valor pero podemos usarlo
unidades/03_relaciones/06_cascade.txt · Última modificación: 2016/07/03 20:35 (editor externo)
Ir hasta arriba
CC Attribution-Noncommercial-Share Alike 3.0 Unported
chimeric.de = chi`s home Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0