休眠 - 多对多关系中的级联删除

Posted

技术标签:

【中文标题】休眠 - 多对多关系中的级联删除【英文标题】:hibernate - cascade delete in many to many relationship 【发布时间】:2015-03-04 11:23:30 【问题描述】:

我有一个 spring mvc 应用程序,它使用 hibernate 来处理 mysql 数据库。我有aclacl_group 表。这两个表与连接表有Many to Many 关系。下面是实体类的结构:

Acl:

public class Acl implements Serializable
   ...
   @ManyToMany(mappedBy = "aclCollection",fetch = FetchType.LAZY)
   private Collection<AclGroup> aclGroupCollection;

  //Setter and getter

AclGroup

public class AclGroup implements Serializable
   ...
    @JoinTable(name = "acl_group_acl", joinColumns = 
       @JoinColumn(name = "acl_group_id", referencedColumnName = "id"), inverseJoinColumns = 
       @JoinColumn(name = "acl_id", referencedColumnName = "id"))
    @ManyToMany(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
    private Collection<Acl> aclCollection;
    //Setter and getter

现在,我需要删除一个AclGroup 对象,并且我想删除acl_group_acl 表中的所有相关记录。但是当我尝试通过休眠删除AclGroup 对象时,什么也没有发生,我收到org.hibernate.exception.ConstraintViolationException 异常和Cannot delete or update a parent row: a foreign key constraint fails 消息。谁能帮我解决这个问题?

更新:

正如@JB Nizet 所说,我删除了cascade = CascadeType.ALL。现在,acl_group 记录和相关的“acl_group_acl”记录被删除。但是我遇到了以下异常:

org.springframework.http.converter.HttpMessageNotWritableException: Could not write content: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer

【问题讨论】:

【参考方案1】:

您告诉 Hibernate,AclGroup 上的所有操作都必须级联到它的 ACL 集合。因此,Hibernate 在删除 AclGroup 时,也会删除其所有 Acl。由于是多对多关联,被删除的 Acl 被其他 AclGroup 引用,从而导致约束冲突。

删除组时删除组的所有 Acl 是没有意义的,因为其他组也包含并且必须继续包含该 acl。

删除cascade = CascadeType.ALL,一切正常。

【讨论】:

这个问题完全不同。请再问一个详细的问题,显示相关的 Spring 方法和完整的堆栈跟踪。

以上是关于休眠 - 多对多关系中的级联删除的主要内容,如果未能解决你的问题,请参考以下文章

同一张表之间多对多的级联删除

hibernate多对多双向关系映射的级联配置

没有级联删除目标的级联删除关系

15.翻译系列:EF 6中的级联删除EF 6 Code-First 系列

Mybatis 多对多(易百教程)

关于多对多关系表做一个级联更新的问题(MYSQL),求高手解答SQL语句