gpt4 book ai didi

java - 删除非级联的自引用实体

转载 作者:行者123 更新时间:2023-12-01 16:04:12 26 4
gpt4 key购买 nike

我有以下(简化的)Hibernate 实体:

@Entity
@Table(name = "package")
public class Package {
protected Content content;

@OneToOne(cascade = {javax.persistence.CascadeType.ALL})
@JoinColumn(name = "content_id")
@Fetch(value = FetchMode.JOIN)
public Content getContent() {
return content;
}

public void setContent(Content content) {
this.content = content;
}

}


@Entity
@Table(name = "content")
public class Content {
private Set<Content> subContents = new HashSet<Content>();
private ArchivalInformationPackage parentPackage;

@OneToMany(fetch = FetchType.EAGER)
@JoinTable(name = "subcontents", joinColumns = {@JoinColumn(name = "content_id")}, inverseJoinColumns = {@JoinColumn(name = "elt")})
@Cascade(value = {org.hibernate.annotations.CascadeType.DELETE, org.hibernate.annotations.CascadeType.REPLICATE})
@Fetch(value = FetchMode.SUBSELECT)
public Set<Content> getSubContents() {
return subContents;
}

public void setSubContents(Set<Content> subContents) {
this.subContents = subContents;
}

@ManyToOne(cascade = {CascadeType.ALL})
@JoinColumn(name = "parent_package_id")
public Package getParentPackage() {
return parentPackage;
}

public void setParentPackage(Package parentPackage) {
this.parentPackage = parentPackage;
}

}

因此有一个包,其中有一个“顶级”内容。顶部内容链接回包,级联设置为全部。顶部内容可以具有许多“子”内容,并且每个子内容可以具有其自己的许多子内容。每个子内容都有一个父包,它可能是也可能不是与顶级内容相同的包(即内容与包的多对一关系)。

关系必须是 ManyToOne(包到内容)和 ManyToMany(内容到子内容),但对于我当前测试的情况,每个子内容仅与一个包或内容相关。

问题是,当我删除包并刷新 session 时,我收到一个 Hibernate 错误,指出我违反了表 subcontents 上的外键约束,具有特定的 content_id 仍然从表 subcontents 中引用。

我在删除包之前尝试专门(递归地)删除内容,但出现了相同的错误。

这个实体树没有被正确删除有什么原因吗?

编辑:阅读答案/评论后,我意识到一个内容不能有多个包,一个子内容不能有多个父内容,所以我将注释从 ManyToOne 和 ManyToMany 修改为一对一和一对多。不幸的是,这并没有解决问题。

我还添加了从内容返回到父包的双向链接,我将其排除在简化代码之外。

最佳答案

如果我理解正确的话,根据 ManyToOne 映射,一个 Content 具有多个 Packages,并且我假设您在上面的简化代码中从 Content 类中删除了“packages”集合字段?

那么,对于您的“包”集合字段,您是否有级联删除(就像您的子内容一样)?如果你这样做,那么我认为它应该有效。当删除根Content时,应该对每个子内容进行级联删除,每个内容再对包进行级联删除。

这有效吗?

关于java - 删除非级联的自引用实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3003291/

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