Hibernate筆記3--多表操作-導航查詢
阿新 • • 發佈:2017-08-23
test ransac mod 多表 private getc als 級聯 默認
配置:
多方:
配置:
2.測試代碼
多方2-Role:
2.測試代碼:
一.一對多操作
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; 8import 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:極其懶惰-->
Hibernate筆記3--多表操作-導航查詢