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:極其懶惰-->