我有以下的(簡化)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;
}
}
所以有一個包,裏面有一個「頂」的內容。頂級內容鏈接回包,級聯設置爲ALL。最上面的內容可能有許多「子」內容,每個子內容可能有許多自己的子內容。每個子內容都有一個父包,它可能與頂級內容(也就是內容到包的多對一關係)可能是也可能不是相同的包。
這些關係需要是ManyToOne(包到內容)和ManyToMany(內容到子目錄),但是對於目前我正在測試每個子內容的情況,僅與一個包或內容有關。
的問題是,當我刪除一個包,並刷新了會議,我得到一個Hibernate的錯誤,說明我違反了一個外鍵約束表上subcontents
,特別content_id
從表subcontents
仍引用。
我已經試過(遞歸)刪除包之前刪除內容,但我得到同樣的錯誤。
是否有這個實體樹沒有被正確刪除的原因?
編輯:閱讀答案後/評論我認識到,一個內容不能有多個包,和子內容不能有多個父目錄,所以我已經修改從多對一和多對多的註解OneToOne和一對多。不幸的是,這並沒有解決問題。
我也添加了雙向鏈接,從內容返回到父程序包,我省略了簡化代碼。
包和內容之間的雙向關係(代碼沒有顯示,但在閱讀描述後我有疑問)? – 2010-06-09 20:38:24
是的,這種關係是雙向的,我不應該從簡化的代碼中解脫出來。 – jwaddell 2010-06-10 02:11:00
嗯...... Package和Content之間的基數仍然是不一致的:)是OneToOne還是OneToMany(你現在有一個ManyToOne從Content到Package)? – 2010-06-10 02:24:27