day28HibernateDay03(一對多和多對多 級聯刪除儲存 cascade四種取值 配置檔案 )
阿新 • • 發佈:2018-11-29
1、持久化類和一級快取 持久化類:JavaBean+對映的配置檔案 持久化物件的三種狀態 瞬時態 持久態 脫管態 Session的一級快取,快照機制 主鍵的生成策略 常用uuid native 2、管理事務 設定隔離級別 丟失更新的問題,樂觀鎖:新增屬性version,配置<version name="version"> 繫結本地的session,事務需要在service層開啟,dao層需要使用session物件 3、查詢的介面 Query介面:HQL的查詢 Criteria介面:QBC查詢(按條件進行查詢) 關聯關係對映一對多對映 1、一對多的設計 2、匯入SQL的建表語句 建立資料庫 匯入SQL指令碼 3、編寫客戶和聯絡人的JavaBean程式(一對多的編寫規則) 級聯儲存 1、如果程式碼只插入其中的一方的資料 如果只儲存其中的一方的資料,那麼程式會丟擲異常 如果想完成只儲存一方的資料,並且把相關聯的資料都儲存到資料庫中,那麼需要配置級聯 級聯儲存是方向性的 2、級聯儲存的效果 級聯儲存:儲存一方的同時可以把關聯的物件也儲存到資料庫中 使用cascade="save-update" 級聯刪除 1、含有外來鍵的刪除客戶功能,那麼SQL語句會報錯 delete from customers where cid =1; 2、如果使用Hibernate框架直接刪除客戶的時候 發現可刪除 3、上述的刪除是普通的刪除,也可以使用級聯刪除,級聯刪除有方向性 <many-to-one cascade="delete"/> 一般都是假刪除就加個欄位置1或0表示已刪除 cascade的取值和孤兒刪除 1、取值 none 不使用級聯 save-update 級聯儲存或更新 delete 級聯刪除 delete-orphan 孤兒刪除(只能應用在一對多關係) all 除了delete-orphan的所有情況(包含save-update delete) all-delete-orphan 包含了delete-orphan的所有情況(包含save-update delete delete-orphan) 2、孤兒刪除(孤子刪除)只有在一對多的環境下才有孤兒刪除 在一對多的關係下,可以將一的一方認為是父方,將多的一方認為是子方,孤兒刪除:在解除了父子關係的時候,將子方記錄就直接刪除 <many-to-one cascade="delete-orphan"/> 某一方放棄外來鍵的維護,為多對多作準備 1、雙方都維護外來鍵的時候,會產生多於的SQL語句 想修改客戶和聯絡人的關係,進行雙向關聯,雙方都會維護外來鍵,會產生多餘的SQL語句 產生的原因:session的一級快取中的快照機制,會讓雙方都更新資料庫,產生了多餘的SQL語句 2、如果不想產生多餘的SQL語句,那麼需要一方來放棄外來鍵的維護 在<set>標籤上配置一個inverse="true",true:放棄,false:不放棄 預設false <inverse="true"> cascade和inverse的區別 1、cascade用來級聯操作(儲存或者修改和刪除) 多方 save-update 2、inverse用來維護外來鍵的 一方放棄維護 級聯儲存 <set cascade="save-update"> 級聯刪除(在多對多很少使用) 級聯刪除
role.hbm.xml
<!-- 配置多對多 name 集合的名稱 table 中間表的名稱 --> <set name="roles" table="sys_user_role" cascade="save-update"> <!-- 當前物件在中間表的外來鍵名稱 --> <key column="uid"></key> <!-- class 集合中存入物件,物件的全路徑 column 集合中物件在中間表的外來鍵名稱 --> <many-to-many class="my.domain.Role" column="rid"/> </set>
User.hbm.xml
<!-- 配置多對多 name 集合的名稱 table 中間表的名稱 --> <set name="roles" table="sys_user_role" cascade="save-update"> <!-- 當前物件在中間表的外來鍵名稱 --> <key column="uid"></key> <!-- class 集合中存入物件,物件的全路徑 column 集合中物件在中間表的外來鍵名稱 --> <many-to-many class="my.domain.Role" column="rid"/> </set>