2012-09-12 79 views
1

JPA意外的行为,我有一些怀疑JPA的CascadeType.ALL@ManyToMany协会的行为。我有以下情形:共享孩子实体

Employee S和Department S之间的@ManyToMany伴随CascadeType.ALLEmployee侧。

如果我创建了两个员工属于同一个部门

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

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

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

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

这是为什么?为什么我在删除alice时不试图删除该部门?我会预料到的!

谢谢!

回答

0

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

+0

是的,但然后什么是Hibernate试图做什么?删除鲍勃后是否删除部门,因为它知道没有其他人参考它?我严重怀疑这是事实。 –

0

Department去除可递延到交易结束,这就是为什么你看到这种行为,如果你在同一事务中删除这两个Employee秒。

如果您尝试删除Employee只有一路S每笔交易,你应该得到承诺期间constrant冲突错误(除非你有你的数据库架构类似ON DELETE CASCADE),因为Hibernate确实在这一点上删除Department

另外,我不认为这是一个合理的想法,在这种关系用CascadeType.ALL,因为Employee不logicaly拥有自己的Department,我相信你,仅供参考做到这一点。

+0

谢谢。我几乎可以肯定,我正在删除爱丽丝和鲍勃在不同的交易,但我会明天检查。 –