【问题标题】:Hibernate Delete Cascade休眠删除级联
【发布时间】:2008-10-13 23:36:30
【问题描述】:

我有一个实体 [项目],其中包含一组其他实体 [问题]。

我已将关系映射到“all-delete-orphan”的级联属性。

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

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

有人知道怎么解决吗?

【问题讨论】:

  • 您可能应该显示映射的相关部分。我一直使用带有非空外键的 all-delete-orphan 并且从来没有遇到过问题。

标签: java hibernate cascade


【解决方案1】:

直接来自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"

关于你的休眠配置中的多对一关系?

【讨论】:

  • 对不起。这确实有效,但我不明白为什么。从文档中它说,当您映射双向关联时(这不是我的情况),使用逆真,无论如何添加它可以很好地工作。谢谢。如果您编辑解释为什么 inverse=true 有效,我会接受您的回答
  • hibernate 文档中有这样的例子吗?在我看来,他询问了休眠状态而您回答了一些休眠文档,这对我来说似乎很奇怪。
  • 我为你添加了一些额外的信息。很高兴这对你有用:)
  • inverse=true 部分确定关系的哪一方是权威的。
【解决方案2】:

一种策略是用on-delete-cascade标记数据库中的外键,这样一旦NHibernate告诉数据库删除一个项目,数据库本身就会级联删除。然后你必须告诉 NHibernate 数据库本身会进行级联删除。

【讨论】:

  • 在 nhibernate 1.2 中是否可行?
【解决方案3】:

删除首先发生在项目上并级联到问题,但项目删除包括问题中 project_id 的空值(为了参照完整性。删除问题对象时您没有遇到异常,但因为级联试图使问题中的 FK 为空。

看着“Java Persistence with Hibernate”,我认为您真正想要的是级联类型的删除或删除,而不是删除孤儿。

【讨论】:

    猜你喜欢
    • 2010-11-03
    • 2011-12-01
    • 2011-04-12
    • 1970-01-01
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多