java hibernate cascade inverse

java - ¿Cuál es la diferencia entre cascade & inverse en hibernate, para qué se utilizan?



(2)

¿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?


En caso de relación muchos a muchos a través de una tabla intermedia; "Cascade" indica si se creará / actualizará un registro en la tabla secundaria. Considerando que "Inverso" indica si se creará / actualizará un registro en la tabla intermedia

Por ejemplo, supongamos que a continuación el escenario 1 el alumno 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.

Entonces hay tres tablas a saber. Tabla de estudiante, teléfono y stud_phone (intermediario). El mapeo puede verse así:

<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 estudiante y se agregan 2 nuevos objetos de teléfono a su conjunto. Y se llama a session.save(student_obj) . Dependiendo de la configuración "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 NO ES NINGUNO e INVERSO es falso

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 e INVERSO es verdadero

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

3) CASCADE es save-update e INVERSE es falso

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 save-update e INVERSE 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 CASCADE fue save-update, los registros también se crearon en la tabla PHONE. 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.


Información a la que se hace referencia desde this enlace this :

1. Inverso: Esto se usa para decidir de qué lado es el propietario de la relación para gestionar la relación (insertar o actualizar la columna de clave externa).

2. cascada: en cascada, después de realizar una operación (guardar, actualizar y eliminar), decidirá si necesita llamar a otras operaciones (guardar, actualizar y eliminar) en otras entidades que tienen una relación entre ellas.

Conclusión: En resumen, el "inverso" decide qué lado actualizará la clave externa, mientras que "cascada" decide qué es lo que debe seguir la operación. Ambos se parecen bastante en la relación, pero son totalmente dos cosas diferentes. Los desarrolladores de Hibernate valen la pena dedicar tiempo a investigar sobre él, ya que si se malinterpreta el concepto o si se utiliza de forma incorrecta, se presentará un serio problema de rendimiento o integridad de datos en su aplicación.

También consulte este tema en el foro: https://forum.hibernate.org/viewtopic.php?f=1&t=949041