Hibernate删除级联

时间:2008-10-13 23:36:30

标签: java hibernate cascade

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

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

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

当我执行session.delete(project)时会抛出一个异常,说project_id不能为null,但如果我删除了对该字段的非null约束,则删除效果很好。

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

3 个答案:

答案 0 :(得分:11)

直接离开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配置中的多对一关系?

答案 1 :(得分:0)

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

答案 2 :(得分:-2)

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

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