JPA CascadeType.ALL 的坑

今天遇到了一個 JPA cascadeType 不管用的問題,折騰了半天。

現象:

一個 Server 對象, ManyToOne Unidirectional 包含了 OS 對象。

但是保存 Server 對象時, CascadeType.PERSIST 不管用。非得用 CascadeType.ALL 才行。

可是我又不想用 CascadeType.ALL, 因爲裏面也含有 CascadeType.REMOVE,我不想一個 Server Instance 被刪了,強迫把所有的 OS 也刪了。

我甚至把 CascadeType.ALL 展開寫,把五種情況都寫全了,就是不管用。只有直接用 CascadeType.ALL 才管用。

爲什麼?

原因是我的 DAO 底層沒有使用 標準 JPA 實現,而是使用 Hibernate 的 SaveOrUpdate 實現。因此,相應的保存事件不是通過 PERSIST。後來,我把 DAO 的實現重寫了。用標準的persist() 和 merge() 函數來實現。這樣 Listener 就能監聽到相應的操作,就會主動替我去 persist() 包含的類了。整個世界都清淨了。

看來起要好好學習 JPA。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章