科技新知

前述有在介紹 spring data relation 的 @OneToMany 的 CascadeType.REMOVE , 有些 hibernate 的行為還是沒有弄清楚 (原文連結 https://lifemag.cyberctm.com/zh_TW/blog/macauyeah/14226)。經過一段時間候,筆者也有新的認知,所以就重新更新一次這部份。

我們在 parent, child 做關聯時,不能偷懶只在 child 更新,不然的話,在同一個 transaction 內進行刪除操作 ,就會出事。在處理 @OneToMany 關係時,必需要經過 collection add remove ,讓 parent 和 child 一起更新。例如下例 code

@OneToMany 需要配合 collection add remove 一起使用(this.books.add(book);),不能只做一邊(book.setAuthor(author);),不然就會出現InvalidDataAccessApiUsageException。這似乎和 hibernate 的狀態有關,只有經過 collection add remove ,hibernate proxy 才會正確反映未來的 db 狀況。特別在某些時候,例如是記有 @Transactional 時,hibernate 似乎不會每次都會真的訪問 db ,如果要準確關聯狀態,就要經過 collection add remove 去更新 proxy。 CascadeType.REMOVEorphanRemoval = true 在 collection add remove 都有相同效果。

馬交野