Hibernate中ManyToOne刪除Many的一方出現 deleted object would be re-saved by cascade
最近在寫SSH整合時出現了 deleted object would be re-saved by cascade這個錯誤
我的Hibernate關係對映檔案如下
<many-to-one name="dept" class="cn.pb.pojo.Dept" lazy="false" >
<column name="DEPTNO" />
</many-to-one>
<set name="emps" inverse="true" lazy="fasle" cascade="save-update,merge,delete">
<key>
<column name="DEPTNO" />
</key>
<one-to-many class="cn.pb.pojo.Emp" />
</set>
然後通過百度找到了如下幾種的解決方法
- 方法1 刪除Set方的cascade
- 方法2 解決關聯關係後,再刪除
- many.getOne().getManys().remove(many); //在所關聯的一方的set中移走當前要刪除的物件
- manyDao.delete(many);
- 方法3 在many-to-one方增加cascade 但值不能是none
以OneToMany為例
1、如果Many端存在於One端的集合中,直接刪除Many,就會丟擲delete object would be re-saved by cascade的異常
出現這種情況的原因是在一對多的一方沒有讓其延遲載入
<set name="emps" inverse="true" lazy="fasle" cascade="save-update,merge,delete">
<key>
<column name="DEPTNO" precision="2" scale="0" />
</key>
<one-to-many class="cn.pb.pojo.Emp" />
</set>
解決方法:lazy屬性設定為true,或者是在One端的集合中先刪除Many端,然後再在Hibernate中刪除Many端
注意:如果直接刪除One端,由於主外來鍵關係肯定會引發“Cannot delete or update a parent row:aforeign key constraint fails”的異常
若按照第三種方案,很顯然在刪除Many的一方之後,One的一方中的資料也會被刪除,這樣給資料的完整性帶來的很大的隱患
而使用第一種方案在編寫資料訪問層的程式碼時需要手動的維護資料的完整性,顯然降低了開發的效率
所以當遇到上述問題時,個人推薦使用第二種解決方案