Hibernate 删除级联

新手上路,请多包涵

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

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

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

When I do session.delete(project) it throws an exception saying that project_id cant be null , but if I remove the not-null constraint to that field,删除效果很好。

任何人都知道如何解决这个问题?

原文由 Pablo Fernandez 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 377
1 个回答

直接来自 文档。我相信这完全解释了你的问题:

然而,这段代码

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 没有它的 parent 就不能真正存在。因此,如果我们从集合中删除一个 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"

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

原文由 abarax 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题