hibernate配置級聯刪除時報錯:could not execute statement; SQL [n/a]; constraint [null]

小張的Dream發表於2020-12-19

做部落格管理系統時,部落格和評論時一對多,多對一的關係,
一個部落格多條評論,在刪除部落格時候報錯
錯誤資訊如下:
could not execute statement; SQL [n/a]; constraint [null]; nested exception is org.hibernate.exception.ConstraintViolationException: could not execute statement
在這裡插入圖片描述
在這裡插入圖片描述
我的資料庫裡面blo_id不允許為空導致刪除部落格出現報錯
在這裡插入圖片描述
解決方案:
在實體類 blog裡面新增級聯,問題解決
在這裡插入圖片描述

cascade(級聯)

級聯在編寫觸發器時經常用到,觸發器的作用是當 主控表資訊改變時,用來保證其關聯表中資料同步更新。若對觸發器來修改或刪除關聯表相記錄,必須要刪除對應的關聯表資訊,否則,會存有髒資料。所以,適當的做法是,刪除主表的同時,關聯表的資訊也要同時刪除,在hibernate中,只需設定cascade屬性值即可。

cascade表示級聯操作,在hibernate配置註解 @OneToOne,@OneToMany,@ManyToMany,@ManyToOne中的屬性。

例如:
@ManyToOne(cascade = CascadeType.REFRESH, optional = true)@JoinColumn(name = "user_id", unique = false)private UserBaseInfo userBaseInfo;

cascade屬性

cascade:就是對錶進行增,刪,改(查詢與它無關)的時候對級聯表進行操作
cascade屬性的可選值:
all :所有情況下均進行關聯操作。
none:所有情況下均不進行關聯操作。這是預設值。
save-update:在執行save/update/saveOrUpdate時進行關聯操作。
delete:在執行delete時進行關聯操作。

inverse

inverse:決定主表還是從表維護關係
兩個可選屬性false與true
inverse屬性預設是false,若為false,則關聯由自己控制,
若為true,則關聯由對方控制。
一般inverse=false會放在多的一端,

inverse 和 cascade兩屬性不同的值hibernate對應不同的行為

inverse=true, cascade=delete版本被刪除,版本與專案的關聯關係記錄被刪除
inverse=false, cascade=delete版本被刪除時,hibernate嘗試置關聯關係為當前版本的記錄,版本欄位為null. 當置位失敗時,版本不能刪除

配置多種級聯

例如:
在這裡插入圖片描述

  1. CascadeType.PERSIST:級聯新增(又稱級聯儲存):對order物件儲存時也對items裡的物件也會儲存。對應EntityManager的presist方法。

  2. 例子:只有A類新增時,會級聯B物件新增。若B物件在資料庫存(跟新)在則拋異常(讓B變為持久態)

  3. CascadeType.MERGE:級聯合並(級聯更新):若items屬性修改了那麼order物件儲存時同時修改items裡的物件。對應EntityManager的merge方法
    。 例子:指A類新增或者變化,會級聯B物件(新增或者變化)

  4. CascadeType.REMOVE:級聯刪除:對order物件刪除也對items裡的物件也會刪除。對應EntityManager的remove方法。

    例子:REMOVE只有A類刪除時,會級聯刪除B類;

  5. CascadeType.REFRESH:級聯重新整理:獲取order物件裡也同時也重新獲取最新的items時的物件。對應EntityManager的refresh(object)方法有效。即會重新查詢資料庫裡的最新資料。

CascadeType.ALL:以上四種都是。
在此記錄學習過程中遇到的錯誤,也許我講的不是很清楚,哈哈,大佬還請勿噴,多多指教

相關文章