[英]Hibernate Delete Cascade
我有一個實體 [項目],其中包含一組其他實體 [問題]。
我已經用“all-delete-orphan”的級聯屬性映射了關系。
在我的數據庫中,關系映射到問題表上的 project_id (FK) 字段。 這個字段不能是 null 因為我不想要沒有項目的問題。
當我執行session.delete(project)
時,它會拋出一個異常,說project_id
不能是null
,但是如果我刪除該字段的not-null
約束,則刪除效果很好。
任何人都知道如何解決這個問題?
直接來自文檔。 這完全解釋了你的問題,我相信:
然而,這段代碼
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
c.Parent = null;
session.Flush();
不會從數據庫中刪除 c; 它只會刪除到 p 的鏈接(並在這種情況下導致 NOT NULL 約束違規)。 您需要顯式刪除()子項。
Parent p = (Parent) session.Load(typeof(Parent), pid);
// Get one child out of the set
IEnumerator childEnumerator = p.Children.GetEnumerator();
childEnumerator.MoveNext();
Child c = (Child) childEnumerator.Current;
p.Children.Remove(c);
session.Delete(c);
session.Flush();
現在,在我們的例子中,如果沒有父級,子級就不能真正存在。 因此,如果我們從集合中刪除一個 Child,我們確實希望它被刪除。 為此,我們必須使用cascade="all-delete-orphan"。
<set name="Children" inverse="true" cascade="all-delete-orphan">
<key column="parent_id"/>
<one-to-many class="Child"/>
</set>
編輯:
關於反向的東西,我相信這只會決定 sql 的生成方式,有關更多信息,請參閱此文檔。
需要注意的一件事是,你有沒有
not-null="true"
休眠配置中的多對一關系?
一種策略是用 on-delete-cascade 標記數據庫中的外鍵,這樣只要 NHibernate 告訴數據庫刪除一個項目,數據庫本身就會級聯刪除。 然后你必須告訴 NHibernate 數據庫本身進行級聯刪除。
如果有人遇到這種情況,請確保您確實設置了正確的 CascadeType(其中之一:ALL、REMOVE、DELETE)。 它需要在您嘗試刪除的實體中:
public class Project {
@Id
private long id;
@OneToMany(mappedBy = "project", cascade = {CascadeType.REMOVE})
public List<Question> questions;
}
無論外鍵是否存在 NULL 約束,刪除都應該有效:
session.delete(project);
刪除首先發生在項目上並級聯到問題,但項目刪除包括問題中 project_id 的清零(為了參照完整性。您不會在刪除問題對象時獲得異常,但因為級聯試圖將問題中的 FK 歸零。
看看“ Java Persistence with Hibernate ”,我認為你真正想要的是級聯類型的刪除或刪除,而不是刪除孤兒。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.