現在的位置: 首頁 > 綜合 > 正文

hibernate 中cascade取值介紹

2018年01月24日 ⁄ 綜合 ⁄ 共 1293字 ⁄ 字型大小 評論關閉

當關聯雙方存在父子關係,就可以在 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,根據需求,我在一對多中經常使用

抱歉!評論已關閉.