1. 程式人生 > >hibernate 中cascade取值介紹

hibernate 中cascade取值介紹

當關聯雙方存在父子關係,就可以在 set 處設定 cascade 為 all-delete-orphan
所謂父子關係,即指由父方控制子方的持久化聖明週期,子方物件必須和一個父方物件關聯。如果刪除父方物件,應該級聯刪除所有關聯的子方物件;如果一個子方物件不再和一個父方物件關聯,應該把這個子方物件刪除。
all-deleteorphan 的能力:
1. 當儲存或更新父方物件時,級聯儲存或更新所有關聯的子方物件,相當於 cascade 為 save-update
2. 當刪除父方物件時,級聯刪除所有關聯的子方物件,相當於 cascade 為 delete
3. 刪除不再和父方物件關聯的所有子方物件
解除父子關係的 java 語句例如:
customer.getOrders().remove(order);
order.setCustomer(null);
tx.commit();
如果 cascade 屬性取預設值 null,當解除父子關係時,會執行如下 sql:
update ORDER set CUSTOMER_ID=null where ID=2
如果要把它也刪掉,則設定:

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

再執行時就會執行:delete from ORDERS where CUSTOMER_ID=2 and ID=2;

cascade幾種取值:
save-update:   級聯儲存(load以後如果子物件發生了更新,也會級聯更新). 但它不會級聯刪除
delete:              級聯刪除, 但不具備級聯儲存和更新
all-delete-orphan: 在解除父子關係時,自動刪除不屬於父物件的子物件, 也支援級聯刪除和級聯儲存更新.
all:                    級聯刪除, 級聯更新,但解除父子關係時不會自動刪除子物件. 
delete-orphan:刪除所有和當前物件解除關聯關係的物件
none:...
級聯儲存和級聯更新總是集合在一起的, 所以沒單獨的save 或 updata

我通常會用到none,save-update,all-delete-orphan,而且還是在一對多和多對多的情況

  1. none就不用說了,在儲存,更新,刪除當前物件時,忽略其關聯的物件
  2. save-update:在儲存和更新當前物件的時候,級聯儲存,更新關聯物件,在多對多的情況下用的很多,而且一般    不用於一對多,一對多我通常會採用none或者all-delete-orphan
  3. delete 刪除當前物件,級聯刪除關聯的物件,我從來單獨沒用過
  4. all 也就是save-update+delete,另外對當前物件執行evict和lock時對關聯物件也執行evict和lock,我從來沒單獨用過
  5. delete-orphan 刪除所以和當前物件解除關聯的物件,我從來沒單獨用過
  6. all-delete-orphan 也就是all+delete-orphan,根據需求,我在一對多中經常使用