hibernate - 级联删除多对多关系

时间:2015-03-04 11:23:31

标签: java hibernate orm many-to-many

我有一个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表中的所有相关记录。但是当我尝试通过hibernate删除AclGroup对象时,没有任何反应,我在org.hibernate.exception.ConstraintViolationException消息中遇到Cannot delete or update a parent row: a foreign key constraint fails异常。谁能帮我解决这个问题呢?

更新

正如@JB Nizet所说,我删除了cascade = CascadeType.ALL。现在,acl_group记录和相关的&#34; acl_group_acl&#34;记录删除。但我得到以下例外:

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 个答案:

答案 0 :(得分:2)

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

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

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