Herramientas de usuario

Herramientas del sitio


unidades:03_relaciones:06_cascade

Diferencias

Muestra las diferencias entre dos versiones de la página.


unidades:03_relaciones:06_cascade [2023/04/07 21:26] (actual) – creado - editor externo 127.0.0.1
Línea 1: Línea 1:
 +====== 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:
 +
 +<uml>
 +class Director
 +class Centro
 +
 +Director "1" -- "1" Centro
 +</uml>
 +
 +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:
 +
 +<uml>
 +class Director 
 +class Domicilio
 +
 +Director "1" -- "1" Domicilio
 +</uml>
 +
 +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:
 +
 +<uml>
 +class Director 
 +class Modulo
 +
 +Director "1" -- "*" Modulo
 +</uml>
 +
 +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:
 +
 +<uml>
 +class Director
 +class CorreoElectronico 
 +
 +Director "1" -- "*" CorreoElectronico 
 +</uml>
 +
 +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 <javadoc h41>org.hibernate.Session#evict(java.lang.Object)|Session.evict(Object objeto)</javadoc> para el objeto principal también se llamará para los objetos relacionados.|
 +| ''lock'' | Si se llama al método <javadoc h41>org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto)</javadoc> (( El método <javadoc h41>org.hibernate.Session#lock(java.lang.Object, org.hibernate.LockMode)|Session.lock(Object objeto,LockMode lockMode)</javadoc> está depreciado y ahora se usa <javadoc h41>org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto)</javadoc>)) para el objeto principal también se llamará para los objetos relacionados.|
 +| ''merge'' | Si se llama al método <javadoc h41>org.hibernate.Session#merge(java.lang.Object)|Session.merge(Object objeto)</javadoc> con el objeto principal también se llamará para los objetos relacionados. |
 +| ''refresh'' | Si se llama al método <javadoc h41>org.hibernate.Session#refresh(java.lang.Object)|Session.refresh(Object objeto)</javadoc> para el objeto principal también se llamará para los objetos relacionados. |
 +| ''replicate'' | Si se llama al método <javadoc h41>org.hibernate.Session#replicate(java.lang.Object, org.hibernate.ReplicationMode)|Session.replicate(Object objeto,ReplicationMode replicationMode)</javadoc> 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''
 +
 +<note tip>Mas información sobre los métodos 
 +<javadoc h41>org.hibernate.Session#evict(java.lang.Object)|Session.evict(Object objeto)</javadoc>
 +<javadoc h41>org.hibernate.Session$LockRequest#lock(java.lang.Object)| LockRequest.lock(Object objeto)</javadoc>, 
 +<javadoc h41>org.hibernate.Session#merge(java.lang.Object)|Session.merge(Object objeto)</javadoc>, 
 +<javadoc h41>org.hibernate.Session#refresh(java.lang.Object)|Session.refresh(Object objeto)</javadoc>
 +<javadoc h41>org.hibernate.Session#replicate(java.lang.Object, org.hibernate.ReplicationMode)|Session.replicate(Object objeto,ReplicationMode replicationMode)</javadoc>
 +en [[unidades:06_objetos_validaciones:01_trabajando_objetos]]</note>