2012-09-12 125 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

謝謝。我幾乎可以肯定,我正在刪除愛麗絲和鮑勃在不同的交易,但我會明天檢查。 –