====== 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: class Director class Centro Director "1" -- "1" Centro 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 ((si ha cambiado algo))? **SI** * ¿Si insertamos el director deberíamos insertar también el centro ((si no existe))? **SI** En este caso el atributo ''cascade'' debería valer ''save_update''. ==== Director-Direccion ==== Si tenemos las siguientes clases Java: class Director class Domicilio Director "1" -- "1" Domicilio 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 ((si ha cambiado algo))? **SI** * ¿Si insertamos el director deberíamos insertar también el domicilio ((si no existe))? **SI** En este caso el atributo ''cascade'' debería tener el valor ''save_update,delete''. ==== Director-Modulo ==== Si tenemos las siguientes clases Java: class Director class Modulo Director "1" -- "*" Modulo Es decir que un director imparte clases en varios módulos y cada módulo lo imparte un único director ((queda un poco raro pero creo que así se entiende el ejemplo)) 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 ((si ha cambiado algo))? **SI** * ¿Si insertamos el director deberíamos insertar también los módulos ((si no existen))? **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: class Director class CorreoElectronico Director "1" -- "*" CorreoElectronico 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ónicos((si ha cambiado algo))? **SI** * ¿Si insertamos el director deberíamos insertar también los correos electrónicos((si no existen))? **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 org.hibernate.Session#evict(java.lang.Object)|Session.evict(Object objeto) para el objeto principal también se llamará para los objetos relacionados.| | ''lock'' | Si se llama al método org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto) (( El método org.hibernate.Session#lock(java.lang.Object, org.hibernate.LockMode)|Session.lock(Object objeto,LockMode lockMode) está depreciado y ahora se usa org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto))) para el objeto principal también se llamará para los objetos relacionados.| | ''merge'' | Si se llama al método org.hibernate.Session#merge(java.lang.Object)|Session.merge(Object objeto) con el objeto principal también se llamará para los objetos relacionados. | | ''refresh'' | Si se llama al método org.hibernate.Session#refresh(java.lang.Object)|Session.refresh(Object objeto) para el objeto principal también se llamará para los objetos relacionados. | | ''replicate'' | Si se llama al método org.hibernate.Session#replicate(java.lang.Object, org.hibernate.ReplicationMode)|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'' ((En el autocompletado del XML en netbeans no ofrece como opción este valor pero podemos usarlo)) | 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'' Mas información sobre los métodos org.hibernate.Session#evict(java.lang.Object)|Session.evict(Object objeto) , org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto), org.hibernate.Session#merge(java.lang.Object)|Session.merge(Object objeto), org.hibernate.Session#refresh(java.lang.Object)|Session.refresh(Object objeto) y org.hibernate.Session#replicate(java.lang.Object, org.hibernate.ReplicationMode)|Session.replicate(Object objeto,ReplicationMode replicationMode) en [[unidades:06_objetos_validaciones:01_trabajando_objetos]]