2010-09-08 8 views
32

¿Cómo usar cascada e inversa en hibernación? ¿Cuál es el procedimiento/etiqueta para definirlos? ¿Están relacionados entre sí y cómo son útiles?¿Cuál es la diferencia entre cascade & inverse en hibernate, para qué se utilizan?

+2

Google "hibernate cascada inversa" trajo [this] (http://www.mkyong.com/hibernate/different-between-cascade-and-inverse/) como el 3er resultado. –

+0

hmmm No me di cuenta de que ya se refería al mismo enlace. – YoK

+1

Yo y @ArunKumar creo que la respuesta de Kaushik Lele debe marcarse como la aceptada. – TechSpellBound

Respuesta

72

En el caso de muchos-a-muchos relación a la Tabla intermediario; "Cascade" indica si se creará/actualizará un registro en la tabla secundaria. Mientras que "Inverso" indica si se creará/actualizará un registro en la tabla intermedia

p. Supongamos a continuación el escenario 1 estudiante puede tener varios teléfonos. Entonces la clase de Estudiante tiene propiedad para el Conjunto de teléfonos. También 1 teléfono puede ser propiedad de varios estudiantes. Entonces, la clase de teléfono tiene propiedad para el conjunto de estudiantes. Este mapeo se menciona en la tabla stud_phone.

Así que hay tres tablas a saber. Tabla de estudiante, teléfono y stud_phone (intermediario). Mapeo podría ser:

<set name="phoneset" table="stud_phone" cascade="save-update" inverse="true"> 
    <key column="mapping_stud_id">< /key> 
    <many-to-many class="com.domain.Phone" column="mapping_phon_id"/> 
</set> 

Se crea un nuevo objeto de estudiantes y 2 objetos nuevos teléfonos se añaden a su conjunto. Y se llama session.save(student_obj). Dependiendo de las configuraciones "en cascada" e "inversa", se dispararán diferentes consultas.

A continuación se muestran diferentes combinaciones de cascada e inversa y su impacto.

1) CASCADE ES NINGUNO y inversa es falsa

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 

2) CASCADE es Ninguno y inverso es cierto

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 

3) CASCADE es SAVE-actualización y inversa es falsa

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 
Hibernate: insert into stud_phone (mapping_stud_id, mapping_phon_id) values (?, ?) 

4) CASCADE es una actualización de guardado e INVERSO true

Hibernate: insert into STUDENT (Name, stud_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 
Hibernate: insert into phone (phone_num, phone_id) values (?, ?) 

Como se puede ver, solo cuando se guardó CASCADE, los registros se crearon también en la tabla TELEFONO. De otra forma no.

Cuando INVERSE era falso (es decir, el alumno era el propietario de la relación) se actualizó la tabla intermedia STUD_PHONE. Cuando el valor inverso es verdadero, el teléfono es el propietario de la relación, por lo tanto, aunque se haya creado un nuevo alumno, la tabla intermedia no se actualizó.

Entonces en el caso de la relación de dos entidades, "cascada" afecta a la tabla de otra entidad y "inversa" afecta a la tabla intermedia. Entonces su efecto es independiente.

+3

Esta respuesta debe marcarse como la mejor respuesta. +1 para una explicación detallada –

+0

De acuerdo con @ArunKumar – TechSpellBound

+0

La mejor respuesta de la historia. –

24

Información de referencia desde Different between cascade and inverse enlace:

1. inversa: Esto se utiliza para decidir qué lado es el dueño relación para gestionar la relación (inserción o actualización de la columna de clave externa).

2. cascada: en cascada, después de una operación (guardar, actualizar y eliminar) se hace , que decidirá si se necesita llamadas otras operaciones (guardar, actualizar y borrar ) en la que otras entidades tiene relación entre sí.

Conclusión: En resumen, la “inversa” decide qué lado va a actualizar la clave externa , mientras que “en cascada” decide ¿cuál es el seguimiento de la operación debe ejecutar. Ambos parecen bastante similares en relación, pero es totalmente diferente cosas diferentes. Los desarrolladores de Hibernate valen la pena dedicar tiempo a investigar en , porque malinterpretar el concepto o usarlo incorrectamente traerá un serio problema de integridad de datos en su aplicación.

También puedes ver este tema del foro: https://forum.hibernate.org/viewtopic.php?f=1&t=949041

Cuestiones relacionadas