科技新知
spring data 關聯型態 02 補充更新
前述有在介紹 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.REMOVE
, orphanRemoval = true
在 collection add remove 都有相同效果。