1. 程式人生 > >Hibernate學習筆記(三)

Hibernate學習筆記(三)

Hibernate學習筆記(一對多、多對多操作)

    hibernate一對多對映配置

    1. 首先建立兩個實體類,我便以客戶與聯絡人為例子說明
    2. 兩個實體類之間要相互的表示
      (1) 在客戶實體類裡面有多個聯絡人

    //hibernate 中要求使用set集合來儲存類似這種情況
    private Set<LinkMan> setLinkMan = new HashSet<LinkMan>();

      (2) 一個聯絡人屬於一個客戶

    //表示聯絡人所屬於的客戶
    private
Customer customer;

    3. 對映檔案裡面配置一對多的關係
      (1) 客戶對映檔案中表示所有聯絡人,使用set標籤表示多個聯絡人,其中name屬性填寫的是一對多關係中多的一方集合的名字,即填寫客戶實體類裡面客戶set集合的名稱,而裡面的key標籤是指名資料庫表的外來鍵名稱,\標籤是指明兩個實體類的關係為一對多、class屬性填寫的是多的一方的實體類路徑

  <!-- 在客戶的對映檔案中表示所有聯絡人 -->
  <set name="setLinkMan">
    <!-- 一對多建表,有外來鍵
        Hibernate雙向維護外來鍵,兩方都要配置
        column屬性值是外來鍵名稱
    -->
<key column="clid"></key> <!-- 客戶所有的聯絡人,class裡面寫聯絡人實體類全路徑 --> <one-to-many class="entity.LinkMan"/> </set>

      (2) 在聯絡人實體類裡面表示所屬的客戶,同樣,\是指明兩個實體類的關係,其中class指明一的那一方實體類的全路徑,而column是需要填寫外來鍵的名稱,也就是之前在客戶實體類配置檔案裡填寫的外來鍵

    <!-- 聯絡人所屬的客戶 -->
    <many-to-one
name="customer" class="entity.Customer" column="clid">
</many-to-one>

    4. 在核心配置檔案中將兩個對映檔案引入

    hibernate一對多級聯操作

    1. 級聯儲存(例如:新增一個客戶,為這個客戶新增聯絡人)
      (1) 複雜做法,需要在兩個實體類之間相互表示關係,對兩張表同時更新

    //建立客戶的物件
    Customer customer = new Customer();
    customer.setCustName("it");
    customer.setCustLevel("vip");
    customer.setCustSource("net");
    customer.setCustPhone("110");
    customer.setCustMobile("999");
    //建立聯絡人物件
    LinkMan linkMan = new LinkMan();
    linkMan.setLkm_name("luck");
    linkMan.setLkm_gender("男");
    linkMan.setLkm_phone("121");
    //建立兩個實體類之間的關係
    customer.getSetLinkMan().add(linkMan);
    linkMan.setCustomer(customer);
    //向資料庫中儲存
    session.save(linkMan);
    session.save(customer);  

      (2) 簡化做法,首先需要在多的一方的對映檔案中配置,在其set標籤里加一個屬性,cascade屬性,它的值有save-update、delete等,分別表示級聯更新、級聯刪除,多個屬性之間用逗號隔開如:“save-update,delete”。這時候只需要將聯絡人加入到客戶裡面、更新客戶即可

    <set name="setLinkMan" cascade="save-update">
    customer.getSetLinkMan().add(linkMan);
    session.save(customer);

    2. 級聯刪除(例如:刪除一個客戶,這個客戶裡面的所有聯絡人也要刪除)
      (1) 需要在配置檔案裡面配置,參照上文

    <set name="setLinkMan" cascade="save-update,delete">

      (2) 在程式碼中就可以直接刪除客戶了

    Customer customer = session.get(Customer.class, 1);
    session.delete(customer);`

    hibernate中一對多的修改操作

    1. 直接修改會產生一個問題,需要配置一個屬性inverse=”true”,因為Hibernate對外來鍵是雙向維護,會對外來鍵進行兩次更新,降低了效率,因此將inverter屬性設定為true可以讓一的一方放棄維護。

    Customer baidu = session.get(Customer.class, 4);
    LinkMan linkMan = session.get(LinkMan.class, 3);
    baidu.getSetLinkMan().add(linkMan);
    linkMan.setCustomer(baidu);

    hibernate的多對多操作(例:使用者和角色)

    1. 多對多的對映配置
      (1) 建立實體類,使用者和角色

    User
    private Integer user_id;
    private String user_Name;
    private String user_password;
    Role
    private Integer role_id;
    private String role_name;
    private String role_memo;

      (2) 一個使用者表示多個角色

    private Set<Role> setRole = new HashSet<Role>();

      (3) 一個角色有多個使用者

    private Set<User> setUser = new HashSet<User>();

      (4) 配置多對多關係,與一對多關係中多的一方配置相似

    角色的配置檔案
    <set name="setUser" table="user_role" cascade="save-update">
        <!-- 當前對映檔案,在第三張表中的外來鍵名稱 -->
        <key column="roleid"></key>
        <!-- 
            class屬性:角色實體類全路徑
            column屬性:角色在第三張表的外來鍵名稱
        -->
        <many-to-many class="entity.User" column="userid"></many-to-many>
    </set>
    使用者的配置檔案
    <!-- 在使用者裡面表示所有的角色 
            name屬性:角色set集合的名稱
            table屬性:第三張表的名稱
    -->
    <set name="setRole" table="user_role" cascade="save-update">
        <!-- 當前對映檔案,在第三張表中的外來鍵名稱 -->
        <key column="userid"></key>
        <!-- 
            class屬性:角色實體類全路徑
            column屬性:角色在第三張表的外來鍵名稱
         -->
        <many-to-many class="entity.Role" column="roleid"></many-to-many>
    </set>

      (5) 在核心配置檔案匯入對映檔案
    2. 多對多的級聯儲存
      (1) 根據使用者儲存角色,在使用者對映檔案裡面講set標籤裡的cascade屬性設定為save-update

     //建立使用者
     User user1 = new User();
     User user2 = new User();
     //建立角色
     Role r1 = new Role();
     Role r2 = new Role();
     Role r3 = new Role();
     //user1有r1\r2的角色
     user1.getSetRole().add(r1);
     user1.getSetRole().add(r2);
     //user2有r2\r3的角色
     user2.getSetRole().add(r2);
     user2.getSetRole().add(r3);
     //儲存使用者
     session.save(user1);
     session.save(user2);  

    3. 多對多的級聯刪除一般不會去用,因為會導致使用者與角色表的資料刪除,因此不需要級聯刪除,只需要去維護第三張關係表就可以了
    4. 維護第三張表
      (1) 讓使用者有某些角色,直接將使用者和角色查出來,在使用者的角色集合中新增即可

    User user = session.get(User.class, 3);
    Role role = session.get(Role.class,1);
    user.getSetRole().add(role);

      (2) 讓使用者沒有某些角色,也是直接將使用者和角色查出來,在使用者的角色集合中刪除即可

    User user = session.get(User.class, 3);
    Role role = session.get(Role.class,1);
    user.getSetRole().remove(role);