级联从休眠到一方到多方

时间:2010-07-15 23:08:09

标签: java hibernate orm

我知道之前可能会问这个问题,但我想具体说明,

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

A有很多B和B有一个A,它是A方面的一对多关系,正在处理包含B组的A实体,然后在创建时,使用A在运行时更新Bs,然后保存或使用hibernate更新A,我想要保存或更新B即级联保存删除但是从A侧(一对多),我认为它只允许从B(多对一)方面

Regads,

2 个答案:

答案 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”,以便在从集合中删除子实体时将其删除。