【问题标题】:ManyToMany with cascade all only cascading one way具有级联的多对多仅以一种方式级联
【发布时间】:2013-08-14 13:35:11
【问题描述】:

我有 2 个实体: 1) 用户 2) 部门。

每个都包含另一个的 SET,因为它们之间的关系是多对多,

我在用户实体和部门实体上标记了 (CascadeType.ALL),当我这样做时:

userX.getDepartments.remove(departmentX);
save(userX);

它按预期工作 - 它实际上暗示

departmentX.getUsers.contains(userX) == false.

被隐式调用。

但是,当我这样做时

departmentY.getUsers.remove(userX);
save(departmentY); 

它不会级联! 意义——我能做到

userX.getDepartments.contains(departmentY) == true 

任何想法为什么级联都只能以一种方式工作? 有解决办法吗?

谢谢

【问题讨论】:

    标签: hibernate jpa many-to-many cascade


    【解决方案1】:

    级联与您正在做的事情无关。级联意味着:当我保存X时,也保存Y。

    您有一个 ManyToMany 双向关联。关联的所有者是用户。这意味着对User.departments 集合的每次更改都将保存到数据库中。另一面 (Department.users) 是反面。这意味着 Hibernate 将忽略对 Department.users 的每次更改。

    您有责任在所有者端执行操作,并且最好保持关联的双方处于一致状态:当用户从部门中删除时,该部门也应从用户中删除,并且反之亦然。 Hibernate 并不关心双方是否处于一致状态:它保持关联所有者方的状态(没有mappedBy 属性的一方)

    【讨论】:

    • 现在我很不情愿使用这种机制,并且在我为用户执行此操作时,由于需要对部门的粗鲁操作进行大量 dao 调用,从而使我的代码变脏...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 2011-06-29
    • 2011-06-23
    相关资源
    最近更新 更多