Hibernate删除级联

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

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

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

当我执行session.delete(项目)时,它抛出一个exception,说project_id不能为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”。

     

编辑:

关于反向内容,我相信这只能决定sql的生成方式,有关详细信息,请参阅此文档 。

有一点需要注意的是,你有吗?

 not-null="true" 

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

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

删除首先在项目上进行并级联到问题,但项目删除包括在问题中对project_id进行归零(对于参照完整性。您没有在删除Question对象时获得exception,但是因为cascade试图在问题中使FK无效。

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