我有一个spring mvc应用程序,它使用hibernate来处理mysql数据库。我有acl
和acl_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
答案 0 :(得分:2)
你告诉Hibernate,AclGroup上的所有操作都必须级联到它的ACL集合。因此,当您删除AclGroup时,Hibernate也会删除其所有Acls。由于它是多对多关联,因此被删除的Acl会被其他AclGroup引用,因此会导致约束违规。
删除组时删除组中的所有Acl是没有意义的,因为其他组也包含并且必须继续包含acl。
删除cascade = CascadeType.ALL
,一切正常。