Hibernate筆記3--多表操作-導航查詢,hibernate3--

來源:互聯網
上載者:User

Hibernate筆記3--多表操作-導航查詢,hibernate3--

一.一對多操作
1.構造實體類及編寫設定檔:
     一方:
 

  1        // 一個Customer對應多個linkman  2          private Set<Linkman> linkmans = new HashSet<>(0);

     配置:
  1         <!-- inverse="true"代表放棄外鍵維護權 -->  2          <set name="linkmans" inverse="true">  3                  <!-- 配置從表的外鍵名 -->  4              <key column="sys_cust_id"></key>  5                 <!-- 配置關聯方式 -->  6              <one-to-many class="entity.Linkman"/>  7          </set>

     多方:
  1         // 多個linkman對應一個customer  2          private Customer customer;

     配置:
  1         <!-- 配置關聯關係 -->  2          <many-to-one name="customer" class="entity.Customer" column="sys_cust_id"></many-to-one>

2.測試代碼
  
  1   package demo;  2   3     import org.hibernate.Session;  4      import org.hibernate.Transaction;  5      import org.junit.Test;  6   7     import entity.Customer;  8      import entity.Linkman;  9      import utils.HibernateUtils; 10  11     //一對多操作 12     public class demo01 { 13          @Test 14          public void test() { 15              Session cs = HibernateUtils.getCurrentSession(); 16              Transaction tx = cs.beginTransaction(); 17              // 建立一個客戶 18             Customer cust = new Customer(); 19              cust.setCustName("A公司"); 20              // 建立與客戶關聯的連絡人 21             Linkman man = new Linkman(); 22              man.setLkmName("Jack"); 23              // 儲存關係--配置一的一方的set標籤的inverse屬性的值為true,放棄外鍵維護權 24             cust.getLinkmans().add(man); 25              man.setCustomer(cust); 26              // 儲存 27             cs.save(cust); 28              cs.save(man); 29              // 提交 30             tx.commit(); 31          } 32      } 33 


二.多對多操作
1.構造實體類及編寫設定檔:
     多方1-User:
          

  1       <!-- 配置關聯關係 多對多,table代表中間表,cascade表示允許級聯操作:all/save-update/delete-->  2              <set name="roles" table="sys_user_role" cascade="all">  3                  <!--外鍵:當前對象在中間表的外鍵名  -->  4                  <key column="sys_user_id"></key>  5                  <!--對方的全限定名,及在中間表的外鍵名  -->  6                  <many-to-many class="entity.Role" column="sys_role_id"></many-to-many>  7              </set>

     多方2-Role:
                
  1 <!-- 配置關聯關係 多對多-->  2              <set name="users" table="sys_user_role" inverse="true">  3                  <!--外鍵:當前對象在中間表的外鍵名  -->  4                  <key column="sys_role_id"></key>  5                  <!--對方的全限定名,及在中間表的外鍵名  -->  6                  <many-to-many class="entity.User" column="sys_user_id"></many-to-many>  7              </set>

2.測試代碼:
   
  1  package demo;  2   3     import org.hibernate.Session;  4      import org.hibernate.Transaction;  5      import org.junit.Test;  6   7     import entity.Role;  8      import entity.User;  9      import utils.HibernateUtils; 10  11     //測試多對多操作 12     public class demo02 { 13          @Test 14          public void testAdd() { 15              Session cs = HibernateUtils.getCurrentSession(); 16              Transaction tx = cs.beginTransaction(); 17              // 建立一個user 18              User u = new User(); 19              u.setUserName("Rose"); 20              // 建立一個role 21              Role r = new Role(); 22              r.setRoleName("painter"); 23              // 維護中間表,設定檔中被動一方放棄維護權 24             u.getRoles().add(r); 25              r.getUsers().add(u); 26              // 儲存 27             cs.save(u); 28              cs.save(r); 29              tx.commit(); 30          } 31  32  33           @Test 34          // 多對多級聯操作,多一個配置,少一個儲存 35         public void testCascade() { 36              Session cs = HibernateUtils.getCurrentSession(); 37              Transaction tx = cs.beginTransaction(); 38              // 建立一個user 39              User user = new User(); 40              user.setUserName("Jack"); 41              // 建立一個role 42              Role role = new Role(); 43              role.setRoleName("model"); 44              // 維護中間表,被動一方配置為放棄維護權 45             user.getRoles().add(role); 46              role.getUsers().add(user); 47              // 儲存user,user配置級聯操作,即user可以操作role 48              cs.save(user); 49              // 下一行語句不報錯,只是維護了cst_role表格,因為role沒有配置級聯操作 50             // cs.save(role); 51              // 提交事務 52             tx.commit(); 53          } 54  55             @Test 56          // 給1號使用者添加2號角色操作 57         public void addRole() { 58              Session cs = HibernateUtils.getCurrentSession(); 59              Transaction tx = cs.beginTransaction(); 60              // 擷取1號使用者 61             User user01 = cs.get(User.class, 1L); 62              // 擷取2號角色 63             Role role02 = cs.get(Role.class, 2L); 64              // 分配角色 65             user01.getRoles().add(role02); 66              // 儲存 67             cs.save(user01); 68              // 提交 69             tx.commit(); 70          } 71  72             @Test 73          // 刪除1號使用者的1號角色 74         public void delRole() { 75              Session cs = HibernateUtils.getCurrentSession(); 76              Transaction tx = cs.beginTransaction(); 77              // 擷取1號使用者 78             User user01 = cs.get(User.class, 1L); 79              // 擷取1號角色 80             Role role01 = cs.get(Role.class, 1L); 81              // 刪除1號使用者的1號角色 82             user01.getRoles().remove(role01); 83              // 儲存 84             cs.save(user01); 85              // 提交事務 86             tx.commit(); 87          } 88  89             @Test 90          // 修改1號使用者為3號角色 91         public void changeRole() { 92              Session cs = HibernateUtils.getCurrentSession(); 93              Transaction tx = cs.beginTransaction(); 94              // 擷取1號使用者 95             User user01 = cs.get(User.class, 1L); 96              // 擷取2號角色 97             Role role02 = cs.get(Role.class, 2L); 98              // 擷取3號角色 99             Role role03 = cs.get(Role.class, 3L);100              // 刪除1號使用者的2號角色101             user01.getRoles().remove(role02);102              // 添加3號角色103             user01.getRoles().add(role03);104              // 儲存105             cs.save(user01);106              // 提交事務107             tx.commit();108          }109      }110 


三.導航查詢
概念:比如客戶與連絡人是一對多的關係,通過查詢客戶也能查詢其對應的連絡人,則稱為導航查詢.導航查詢預設為消極式載入;如果使消極式載入失效,則在客戶的映射關係檔案的set標籤內配置lazy屬性
   <!-- lazy : 配置查詢關聯對象的消極式載入
                             true:使用延遲,預設
                             false:不使用延遲
                             extra:極其懶惰-->

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.