Borrar Entidades en Relaciones @ManyToMany

El borrado de en tidades en relaciones @ManyToMany puede ser complejo de entender. Por lo general, en este tipo de relaciones hay una entidad que es la dominante, se suele indicar en la propiedad mappedBy. Si esta entidad se borra, entonces la otra entidad tambien se elimina, además, de los registros de la tabla de unión (join).

Para el caso en el que las dos entidades tienen el mismo nivel, es decir, pueden existir por si mismas, entonces tenemos que configurarlas de la siguiente manera:

@Entity
public class Role extends Identifiable {
 
    @ManyToMany(cascade ={CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name="Role_Permission",
            joinColumns=@JoinColumn(name="Role_id"),
            inverseJoinColumns=@JoinColumn(name="Permission_id")
        )
    public List<Permission> getPermissions() {
        return permissions;
    }
 
    public void setPermissions(List<Permission> permissions) {
        this.permissions = permissions;
    }
}
 
@Entity
public class Permission extends Identifiable {
 
    @ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH})
    @JoinTable(name="Role_Permission",
            joinColumns=@JoinColumn(name="Permission_id"),
            inverseJoinColumns=@JoinColumn(name="Role_id")
        )
    public List<Role> getRoles() {
        return roles;
    }
 
    public void setRoles(List<Role> roles) {
        this.roles = roles;
    }
 
}

De esta menera, solo se borran los registros de la tabla de unión (join).

Hay que destacar, que el cambio principal esta en la anotación @JoinTable. Donde se invierten los valores de las propieades joinColumns e inverseJoinColumns.

Bibliografia y Ejemplos


JUAN MIGUEL BERNAL GONZALEZ 19/06/2019 09:34