tablas tabla relaciones relacionar relacionadas relacion muchos intermedia insertar datos cascada borrar hibernate jpa many-to-many jpa-2.0 cascade

tabla - JPA Hibernate de muchos a muchos en cascada



relaciones muchos a muchos java (3)

Estoy usando JPA 2.0 e hibernate. Tengo una clase de usuario y una clase de grupo de la siguiente manera:

public class User implements Serializable { @Id @Column(name="USER_ID") private String userId; @ManyToMany @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "GROUP_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") } ) private Set<Group> groupList; //get set methods } public class Group { @Id @Column(name="GROUP_ID") private String groupId; @ManyToMany(mappedBy="groupList") private Set<User> memberList; //get set methods }

Y luego, creo un usuario y un grupo y luego asigno el usuario al grupo.

Lo que quiero es que cuando elimine el grupo, el grupo se elimine (por supuesto) y todas las relaciones de grupo de usuarios que tenga el grupo se eliminen automáticamente de la tabla de unión USER_GROUP, pero el usuario no se elimina de la Tabla de USUARIO

Con el código que tengo arriba, solo se borrará la fila en la tabla GROUP cuando elimine un grupo y el usuario todavía tendrá una entrada al grupo eliminado en la tabla de unión USER_GROUP.

Si pongo cascada en la clase de Usuario de esta manera:

@ManyToMany(cascade=CascadeType.ALL) @JoinTable(name = "USER_GROUP", joinColumns = { @JoinColumn(name = "GROUP_ID") }, inverseJoinColumns = { @JoinColumn(name = "USER_ID") }) private Set<Group> groupList;

¡Cuando borro el grupo, el usuario también será eliminado!

¿Hay alguna manera de lograr lo que quiero?


Como ya se indicó, convierta al propietario del grupo en la relación si no necesita realizar una cascada desde el lado del usuario.

Luego, intente utilizar cascade=CascadeType.MERGE para no eliminar en cascada al usuario cuando elimine el grupo.


La forma en que lo tiene asignado, el User es el lado de la gestión de la relación, por lo tanto, será responsable de actualizar la tabla de unión.

Cambie la asignación de JoinTable de User a Group y establezca la propiedad groupList de User para que tenga el atributo mappedBy . Eso cambiará el grupo al lado de administración de la relación y hará que las llamadas de persistencia / actualización al grupo administren la tabla de unión.

Pero tome nota de eso, no podrá simplemente agregar un grupo a un usuario, guardarlo y continuar; en su lugar, tendrá que agregar un usuario al grupo y guardar el grupo para ver los cambios, pero Teniendo el bi-direccional "muchos-a-muchos" con suerte, estarás administrando de cerca esa relación de todos modos.


Viendo el problema desde otro ángulo:

Puede agregar restricciones FK a la tabla de asignación de muchos a muchos. En realidad, siempre debes tener FK en tu DB por razones de integridad de datos. En este caso, por ejemplo, al menos el usuario no podría eliminarse mientras deja silenciosamente filas huérfanas en la tabla de asignación.

Cuando tiene FK, puede especificar la acción referencial de eliminación de cascada en las restricciones, y el DB administrará la eliminación automática de la tabla de asignación, pero no de la entidad, como usted solicitó.