我有2个实体: 1)用户 2)部门。
每个都包含另一个SET,因为它们之间的关系是很多ToMany,
我在用户实体和部门实体上标记了(CascadeType.ALL),当我这样做时:
userX.getDepartments.remove(departmentX);
save(userX);
它的工作方式与预期一致 - 它实际上意味着
departmentX.getUsers.contains(userX) == false.
隐式调用。
但是,当我这样做时
departmentY.getUsers.remove(userX);
save(departmentY);
它没有级联! 意思是 - 我可以做到
userX.getDepartments.contains(departmentY) == true
任何想法为什么级联都只有一种方式? 有解决方案吗?
感谢
答案 0 :(得分:1)
级联与你正在做的事情无关。级联意味着:当我保存X时,也保存Y.
您有一个ManyToMany双向关联。该协作的所有者方是User。这意味着对User.departments
集合的每个更改都将保存到数据库中。另一方(Department.users
)是反面。这意味着Hibernate将忽略对Department.users
的每次更改。
您有责任在所有者方面执行操作,并且最好将关联的两端保持在一致状态:当用户从部门中移除时,该部门也应该从用户中删除,并且反之亦然。 Hibernate并不关心双方是否处于连贯状态:它会持续关联所有者方的状态(没有mappedBy
属性的那个)