1. 程式人生 > >day28HibernateDay03(一對多和多對多 級聯刪除儲存 cascade四種取值 配置檔案 )

day28HibernateDay03(一對多和多對多 級聯刪除儲存 cascade四種取值 配置檔案 )

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>