hibernate關聯總結
在一對多與多對一的關聯關係中,儲存資料最好的通過多的一方來維護關係,這樣可以減少update語句的生成,從而提高hibernate的執行效率!
配置一對多與多對一,這種叫“雙向關聯”
只配置一對多, 叫“單項一對多”
只配置多對一, 叫“單項多對一”
注意:
配置了哪一方,哪一方才有維護關聯關係的許可權!
Inverse屬性
Inverse屬性,是在維護關聯關係的時候起作用的。
表示控制權是否轉移。(在一的一方起作用)
Inverse , 控制反轉。
Inverse = false 不反轉; 當前方有控制權
True 控制反轉; 當前方沒有控制權
維護關聯關係中,是否設定inverse屬性:
1. 儲存資料
有影響。
如果設定控制反轉,即inverse=true, 然後通過部門方維護關聯關係。在儲存部門的時候,同時儲存員工, 資料會儲存,但關聯關係不會維護。即外來鍵欄位為NULL
2. 獲取資料
無。
3. 解除關聯關係?
有影響。
inverse=false, 可以解除關聯
inverse=true, 當前方(部門)沒有控制權,不能解除關聯關係
(不會生成update語句,也不會報錯)
4. 刪除資料對關聯關係的影響?
有影響。
inverse=false, 有控制權, 可以刪除。先清空外來鍵引用,再刪除資料。
inverse=true, 沒有控制權: 如果刪除的記錄有被外來鍵引用,會報錯,違反主外來鍵引用約束! 如果刪除的記錄沒有被引用,可以直接刪除。
cascade 屬性
cascade 表示級聯操作 【可以設定到一的一方或多的一方】
none 不級聯操作, 預設值
save-update 級聯儲存或更新
delete 級聯刪除
save-update,delete 級聯儲存、更新、刪除
all 同上。級聯儲存、更新、刪除
設定inverse屬性,在多對多種維護關聯關係的影響?
1) 儲存資料
有影響。
inverse=false ,有控制權,可以維護關聯關係; 儲存資料的時候會把物件關係插入中間表;
inverse=true, 沒有控制權, 不會往中間表插入資料。
2) 獲取資料
無。
3) 解除關係
// 有影響。
// inverse=false ,有控制權, 解除關係就是刪除中間表的資料。
// inverse=true, 沒有控制權,不能解除關係。
4) 刪除資料
有影響。
// inverse=false, 有控制權。 先刪除中間表資料,再刪除自身。
// inverse=true, 沒有控制權。 如果刪除的資料有被引用,會報錯! 否則,才可以刪除