Inverse 和 cascade的區別

Inverse 和 cascade的區別
實際上,他們是互不相關的概念:
inverse 是指的關聯關係控制方向 ,而cascade 指的是層級之間的連鎖操作。


級聯刪除
在默認情況下,當Hibernate刪除一個持久化對象時,不會自動刪除與他關聯的其他持久化對象,如果希望Hibernate刪除Customer對象時,自動刪除和Customer關聯的Order對象,可以把cascade的屬性設置爲delete。
注意:在關聯的雙方的哪一方設置cascade爲delete呢?是不是要在雙方都要設置呢?這個主要看項目本身。
如果項目是針對一對多的,應該在“one”方設置cascade爲delete,不能在“many”方設置cascade爲delete 。
提示:所謂刪除一個持久化對象,並不是指從內存中刪除這個對象,而是從數據庫中刪除相關的記錄。這個對象依然存在於內存中,只不過由持久化狀態轉變成爲臨時狀態。
cascade屬性可以有多個值,中間用逗號分開,eg:cascade="save-update,delete

<set name="orders"    cascade="all-delete-orphan" inverse="true">
<key     column="c_id"></key>
<one-to-many class="net.mbs.mypack.Order" />
</set>

Cascade 屬性的all-delete-orphan
當我們解除Customer和Order對象之間的關係時:
customer.getOrdersa().remove(order);
order.setCustomer(null);

系統會執行 update order set c_id=null where id=? //前提: c_id列允許爲null
如果希望Hibernate自動刪除不再和Customer對象關聯的Order對象,可以把cascade屬性設置爲all-delete-orphan

all-delete-orphan值的總結
1:當保存Customer對象時,級聯保存所有關聯的Order對象,相當於cascade=“save-update”
2:當刪除Customer對象時,級聯刪除所有關聯的Order對象,相當於cascade=“delete” .
3;刪除不再和Customer對象關聯的所有Order對象

當關聯雙方存在父子關係時,就可以把父方的cascade屬性設置爲“all-delete-orphan”
] 所謂父子關係,是指由父方子方的持久化生命週期,子方對象必須和一個父方對象關聯
如果刪除父方對象,應該級聯刪除所有的關聯的子方對象。
如果子方對象不再和一個父方對象關聯,應該把這個子方對象刪除。
類與類之間是否存在父子關係是由業務邏輯需求來決定 的,通常認爲Customer和Order之間存在父子關係,而Company和Worker 之間不存在父子關係。


食品類別---->蔬菜---水果
蔬菜------->西紅柿類別
水果------->蘋果----柿子
上面的每種類別代表一個Category對象,這些對象形成了樹型數據結構,每個Category對象可以和一個父類別Category對象關聯,同時還可以和一組子類別Category對象關聯
爲了實現上面的圖例,我們製作一Category類,爲了表達雙向關聯關係,我們在Category類中定義兩個屬性:
1:parentCategory:引用父類別的Category對象(比如蘋果類別對象的parentCategory就是水果)
2。childCategories :引用一組子類別Category對象


現在相成的關係是
一個Category對象可以一個父Category對象關聯(如水果類別對象有一個父類,而食品類別的父類是自身)
一個Category對象可以和零個(如蘋果類別對象沒有子類)或一組子類Category對象關聯(如水果類別對象有一組子類)

數據庫表方面,我們只提供了一個叫category的表,有三列
ID :標識列,表示每一類別
Name:類別的名字 ;
category_id 當前類別的父類別的id號,如果是頂級類別,如食品類別,category_id列的值自的OID。
注意 category_id列必須允許爲null,否則在插入時,將丟出nullPointException異常     
注意事項
1:在category.hbm.xml中應該配置set的cascade屬性值爲 all-delete-orphan,這樣在刪除一個父類別後,只要讓他的所有子類別的對應的父類別爲null ,就可以方便的刪除所有子類別。
2:在OID中,在更新了兩個類別之間的關係,並進行事務的提交後,必須調用session.clear()將session緩存進行清空,否則在以後用load()或get()加載的對象還是沒有更新前的狀態(如果session緩存中已經在要加載OID相同的對象)
3。在刪除一個類別時,必須先刪除此類別和父類別以及所有子類別的關聯。
Category category=(Category)session.load(Category.class,cate.getId());
category.getParentCategory().getChildCategories().remove(category);
Object [] cs=category.getChildCategories().toArray();
System.out.println("數組長度"+cs.length);
for(int i=0;i < cs.length;i++)
{//刪除和所有子類別的關聯關係
Category child=(Category)cs[i];
chlid.setParentCategory(null);
category.getChildCategories().remove(cs[i]);
}
session.delete(category);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章