gpt4 book ai didi

java - hibernate - 多对多关系中的级联删除

转载 作者:行者123 更新时间:2023-12-02 04:55:05 25 4
gpt4 key购买 nike

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

访问权限:

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 aparent row :外键约束失败消息。谁能帮我解决这个问题吗?

更新:

正如 @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,一切都会正常工作。

关于java - hibernate - 多对多关系中的级联删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28853202/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com