Java 从一侧到另一侧级联休眠

Java 从一侧到另一侧级联休眠,java,hibernate,orm,Java,Hibernate,Orm,我知道这个问题以前可能会被问到,但我想具体点 我使用的hibernate没有注释,因此我的情况是,如果我有以下关系: A有很多B,B有一个A,这是一个一对多的关系,我处理的是一个包含B集合的实体,然后在运行时使用A创建、更新B,然后使用hibernate保存或更新A,我希望它也保存或更新B,即级联保存删除,但从A的一侧(一对多),我认为这是允许从B(多到一)方只 Regads,级联与单向收集一起工作。只需添加“cascade=all”或甚至cascade=“all delete orphan”,

我知道这个问题以前可能会被问到,但我想具体点

我使用的hibernate没有注释,因此我的情况是,如果我有以下关系:

A有很多B,B有一个A,这是一个一对多的关系,我处理的是一个包含B集合的实体,然后在运行时使用A创建、更新B,然后使用hibernate保存或更新A,我希望它也保存或更新B,即级联保存删除,但从A的一侧(一对多),我认为这是允许从B(多到一)方只


Regads,

级联与单向收集一起工作。只需添加“cascade=all”或甚至cascade=“all delete orphan”,这样,如果从集合中删除子实体,子实体就会被删除。

我不确定我是否理解了这个问题,但可以为一对多关联定义级联操作(请参阅部分)。下面是以下内容的摘录:

你可以解决工作中的挫折 通过使用 瀑布

<set name="children" inverse="true" cascade="all">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>
类似地,我们不需要迭代 孩子们在储蓄或储蓄的时候 删除父级
。以下 从中删除
p
及其所有子项 数据库

Parent p = (Parent) session.load(Parent.class, pid);
session.delete(p);
session.flush();
但是,以下代码:

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
c.setParent(null);
session.flush();
不会从数据库中删除
c
。 在这种情况下,它只会删除 链接到
p
并导致
不为空
违反约束。你需要 显式地
delete()
子级

Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();
在我们的例子中,
子项
不可能存在 没有父母。所以如果我们移除一个
Child
我们希望 它将被删除。要做到这一点,我们必须 使用
cascade=“全部删除孤立项”


即使集合映射 指定
inverse=“true”
,级联为 仍然通过迭代 集合元素。如果你需要一个 对象可以由保存、删除或更新 级联,则必须将其添加到 收集光是简单地说是不够的 调用
setParent()

工具书类

你的意思是我可以在一对多关系映射文件中添加cascade=all,它将处理更新childs?是的,这是hibernate文档中所说的。(见第6章,文集)清晰、直接、条理清晰的回答,致以良好的问候
Parent p = (Parent) session.load(Parent.class, pid);
Child c = (Child) p.getChildren().iterator().next();
p.getChildren().remove(c);
session.delete(c);
session.flush();
<set name="children" inverse="true" cascade="all-delete-orphan">
    <key column="parent_id"/>
    <one-to-many class="Child"/>
</set>