共享子实体的JPA意外行为

时间:2012-09-12 16:02:25

标签: hibernate jpa many-to-many

我对JPA的CascadeType.ALL@ManyToMany关联的行为有些怀疑。我有以下情况:

@ManyToManyEmployeeDepartmentCascadeType.ALL之间存在Employee关联。

如果我创建属于同一部门的两名员工

Department sales = new Department("sales");
Employee alice = new Employee("alice", sales);
Employee bob = new Employee("bob", sales);

然后我坚持他们,由于级联,该部门按预期坚持。

然后我一次删除alicebob。当我删除alice时,Employee被删除但销售部门未更改。

但是当我删除bobalice之后)后,销售部门会自动删除。

为什么?我删除alice时为什么不尝试删除部门?我会期待的!

谢谢!

2 个答案:

答案 0 :(得分:0)

预计实体不能引用不存在的实体。因此,如果JPA按预期工作,那么在Alice删除之后和Bob之前,后者将引用不存在的部门。

答案 1 :(得分:0)

删除Department可能会在交易结束时被删除,这就是为什么如果在同一事务中同时删除Employee,就会发现这种行为。

如果你尝试每个事务只删除Employee个中的一个,你应该在提交期间得到一个constrant违规错误(除非你的数据库模式中有ON DELETE CASCADE之类的东西),因为Hibernate确实删除了Department此时此刻。

此外,我认为在这种关系中使用CascadeType.ALL是不合理的,因为Employee并非逻辑上拥有其Department,我相信你这样做仅用于说明目的。