最近在給同學進行調試代碼時遇到級聯刪除的問題時,當時沒能立馬想到級聯!等回宿舍後,卻想起來了要設置級聯cascade屬性。因此就將級聯的再作一個總結吧!以下:數據庫
級聯操做fetch
一.簡單的介紹spa
cascade和inversehibernate
l Casade用來講明當對主對象進行某種操做時是否對其關聯的從對象也做相似的操做,經常使用的cascade:none,all,save-update,delete, lock,refresh,evict,replicate,persist, merge,delete-orphan(one-to-many)。通常對many-to-one,many-to-many不設置級聯,在<one-to-one>和<one-to-many>中設置級聯。調試
l inverse表示「是否放棄維護關聯關係」(在Java裏兩個對象產生關聯時,對數據庫表的影響),在<one-to-many>和<many-to-many>的集合定義中使用,inverse=」true」表示該對象不維護關聯關係;該屬性的值通常在使用有序集合時設置成false(注意hibernate的缺省值是false)。對象
one-to-many維護關聯關係就是更新外鍵。many-to-many維護關聯關係就是在中間表增減記錄。io
注: 配置成one-to-one的對象不維護關聯關係table
二,屬性的解析
class元素的lazy屬性設定爲true,表示延遲加載,若是lazy設爲false,則表示當即加載。如下對這二點進行說明。
當即加載:表示Hibernate在從數據庫中取得數據組裝好一個對象(如:Student)後,會當即再從數據庫取得數據組裝此對象所關聯的對象(如:Grade)。
延遲加載:表示Hibernate在從數據庫中取得數據組裝好一個對象(如:Student)後,不會當即再從數據庫中取得數據組裝此對象所關聯的對象(如:Grade),而是等到須要時,纔會從數據庫取得數據組裝此關聯對象。
<one-to-one>元素的cascade屬性代表操做是否從父對象級聯到被關聯的對象,它的取得能夠是如下幾種:
none:在保存,刪除或修改當前對象時,不對其附屬對象(關聯對象)進行級聯操做。它是默認值。
save-update:在保存,更新當前對象時,級聯保存,更新附屬對象(臨時對象,遊離對象)。
delete:在刪除當前對象時,級聯刪除附屬對象。
all:全部狀況下均進行級聯操做,即包含save-update和delete操做。
delete-orphan:刪除和當前對象解除關係的附屬對象。
<one-to-one>元素的fetch屬性的可選值是join和select,默認是select。
當fetch屬性設定爲join時,表示鏈接抓取(Join fetching):Hibernate經過
在Select語句中使用outer join(外鏈接)來得到對象的關聯實例或者關聯集合。
當fetch屬性設定爲select時,表示查詢抓取(Select fetching):須要另外發
送一條Select語句抓取當前對象的關聯實體或集合。class
三。代碼練習配置
<set name="emps" cascade="save-update">
<key column="depart_id"/>
<one-to-many class="Employee"/>
</set>
<set name="students" table="taacher_student" inverse="true"><!-- table是用來指定中間表的屬性 --><key column="teacher_id"></key><!-- 查找教師id時,連接中間表表的teacher_id --><many-to-many class="Student" column="student_id"></many-to-many></set>