我知道之前可能会问这个问题,但我想具体说明,
我正在使用没有注释的hibernate,所以我的情况是如果我有以下关系:
A有很多B和B有一个A,它是A方面的一对多关系,正在处理包含B组的A实体,然后在创建时,使用A在运行时更新Bs,然后保存或使用hibernate更新A,我想要保存或更新B即级联保存删除但是从A侧(一对多),我认为它只允许从B(多对一)方面
Regads,
答案 0 :(得分:3)
我不确定我是否理解了这个问题,但绝对有可能为一对多关联定义级联操作(参见6.2. Collection mappings部分)。下面是Chapter 21. Example: Parent/Child的摘录:
21.3. Cascading life cycle
你可以解决挫折问题 使用显式调用save() 级联。
<set name="children" inverse="true" cascade="all"> <key column="parent_id"/> <one-to-many class="Child"/> </set>
这将上面的代码简化为:
Parent p = (Parent) session.load(Parent.class, pid); Child c = new Child(); p.addChild(c); session.flush();
同样,我们不需要迭代 在保存或拯救孩子时 删除
Parent
。下列 删除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
并导致NOT NULL
约束违规。你需要 明确delete()
Child
。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
不能存在 没有父母。所以,如果我们删除一个 来自集合的Child
,我们确实想要 它被删除。为此,我们必须这样做 使用cascade="all-delete-orphan"
。<set name="children" inverse="true" cascade="all-delete-orphan"> <key column="parent_id"/> <one-to-many class="Child"/> </set>
即使是集合映射 指定
inverse="true"
,级联是 仍然通过迭代处理 集合元素。如果你需要 对象被保存,删除或更新 级联,你必须将它添加到 采集。简单来说还不够 致电setParent()
。
答案 1 :(得分:0)
Cascades使用单向集合。只需添加“cascade = all”或甚至cascade =“all-delete-orphan”,以便在从集合中删除子实体时将其删除。