gpt4 book ai didi

java - Hibernate 删除级联

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:19:17 28 4
gpt4 key购买 nike

我有一个实体 [Project],其中包含一组其他实体 [Questions]。

我已经用“all-delete-orphan”的级联属性映射了关系。

在我的数据库中,关系映射到问题表上的 project_id (FK) 字段。此字段不能为空,因为我不想要没有项目的问题。

当我执行 session.delete(project) 时,它抛出一个异常说明 project_id 不能为 null,但是如果我删除 not-null 约束到该字段,删除效果很好。

有人知道怎么解决吗?

最佳答案

直接来自 documentation .我相信这完全解释了你的问题:

但是,这段代码

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 是如何生成的,参见 doc了解更多信息。

需要注意的是,你有没有

not-null="true"

关于您的 hibernate 配置中的多对一关系?

关于java - Hibernate 删除级联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/199428/

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