1

CascadeType.ALL我对 JPA与@ManyToMany协会的行为有一些疑问。我有以下情况:

s 和s之间有一个@ManyToMany关联。EmployeeDepartmentCascadeType.ALLEmployee

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

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

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

然后我删除aliceand bob,一次一个。当我删除时aliceEmployee它被删除但销售部门没有改变。

但是当我删除bob(之后alice)时,销售部门会自动删除。

这是为什么?为什么我删除时它没有尝试删除部门alice?我早就料到了!

谢谢!

4

2 回答 2

0

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

于 2012-09-12T16:19:18.697 回答
0

删除Department可能会延迟到事务结束,这就是如果您Employee在同一事务中删除两个 s 会观察到这种行为的原因。

如果您尝试在Employee每个事务中仅删除一个 s,则在提交期间应该会收到一个持续的违规错误(除非您ON DELETE CASCADE的数据库模式中有类似的内容),因为Department此时 Hibernate 确实删除了。

另外,我认为CascadeType.ALL在这种关系中使用它不是一个合理的想法,因为Employee它在逻辑上并不拥有它Department,我相信你这样做只是为了说明目的。

于 2012-09-12T16:30:42.033 回答