Java 从一侧到另一侧级联休眠
我知道这个问题以前可能会被问到,但我想具体点 我使用的hibernate没有注释,因此我的情况是,如果我有以下关系: A有很多B,B有一个A,这是一个一对多的关系,我处理的是一个包含B集合的实体,然后在运行时使用A创建、更新B,然后使用hibernate保存或更新A,我希望它也保存或更新B,即级联保存删除,但从A的一侧(一对多),我认为这是允许从B(多到一)方只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”,
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>