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.