hibernate - 多对多关系中的级联删除
hibernate - cascade delete in many to many relationship
我有一个 spring mvc 应用程序,它使用休眠来处理 mysql 数据库。我有 acl
和 acl_group
table。这两个 table 与 join table 有 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
table 中的所有相关记录也被删除。但是当我尝试通过休眠删除一个 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
您告诉 Hibernate,AclGroup 上的所有操作都必须级联到它的 ACL 集合。因此,当您删除 AclGroup 时,Hibernate 也会删除其所有 Acl。由于它是多对多关联,被删除的 Acl 被其他 AclGroup 引用,因此导致约束冲突。
在删除组时删除组的所有 Acl 是没有意义的,因为其他组也包含并且必须继续包含 acl。
删除 cascade = CascadeType.ALL
,一切都会正常。
我有一个 spring mvc 应用程序,它使用休眠来处理 mysql 数据库。我有 acl
和 acl_group
table。这两个 table 与 join table 有 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
table 中的所有相关记录也被删除。但是当我尝试通过休眠删除一个 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
您告诉 Hibernate,AclGroup 上的所有操作都必须级联到它的 ACL 集合。因此,当您删除 AclGroup 时,Hibernate 也会删除其所有 Acl。由于它是多对多关联,被删除的 Acl 被其他 AclGroup 引用,因此导致约束冲突。
在删除组时删除组的所有 Acl 是没有意义的,因为其他组也包含并且必须继续包含 acl。
删除 cascade = CascadeType.ALL
,一切都会正常。