簡體   English   中英

Hibernate 刪除級聯

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM