1. 程式人生 > >Hibernate筆記3--多表操作-導航查詢

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

test ransac mod 多表 private getc als 級聯 默認

一.一對多操作
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:極其懶惰-->

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