Hibernate删除级联

Pab*_*dez 9 java hibernate cascade

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

我已经将关系映射到了"all-delete-orphan"的级联属性.

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

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

谁知道如何解决这个问题?

aba*_*rax 11

直接来自文档.这完全解释了我的问题:

但是,这段代码

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();
Run Code Online (Sandbox Code Playgroud)

不会从数据库中删除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();
Run Code Online (Sandbox Code Playgroud)

现在,在我们的例子中,如果没有父母,孩子就不可能存在.因此,如果我们从集合中删除一个Child,我们确实希望将其删除.为此,我们必须使用cascade ="all-delete-orphan".

<set name="Children" inverse="true" cascade="all-delete-orphan">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
Run Code Online (Sandbox Code Playgroud)

编辑:

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

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

not-null="true"
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*yer -2

删除首先发生在项目上,然后级联到问题,但项目删除包括将问题中的project_id清空(为了引用完整性)。删除问题对象时不会出现异常,但因为cascade 试图使问题中的 FK 无效。

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