Hibernate_day03
一、今天內容
0 列表功能實現
1 表與表之間關係回顧
(1)一對多(客戶和聯絡人)
(2)多對多(使用者和角色)
2 hibernate一對多操作
(1)一對多對映配置
(2)一對多級聯儲存
(3)一對多級聯刪除
(4)inverse屬性
3 hibernate多對多操作
(1)多對多對映配置
(2)多對多級聯儲存(重點)
(3)多對多級聯刪除
(4)維護第三張表
二、客戶列表功能
1 sessionFactory已經關閉了,不需要關閉
2 dao裡面程式碼
//使用hibernate實現查詢列表 public List<Customer> findAll() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { //得到sessionFactory sessionFactory = HibernateUtils.getSessionFactory(); //得到session session = sessionFactory.openSession(); //開啟事務 tx = session.beginTransaction(); //查詢所有記錄 Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); //提交事務 tx.commit(); return list; }catch(Exception e) { tx.rollback(); }finally { session.close(); //sessionFactory不需要關閉 //sessionFactory.close(); } return null; }
三、表與表之間關係回顧(重點)
1 一對多
(1)分類和商品關係,一個分類裡面有多個商品,一個商品只能屬於一個分類
(2)客戶和聯絡人是一對多關係
- 聯絡人:公司裡面的員工,百度裡面有很多員工,聯絡員工
** 公司和公司員工的關係
- 客戶是一,聯絡人是多
- 一個客戶裡面有多個聯絡人,一個聯絡人只能屬於一個客戶
(3)一對多建表:通過外來鍵建立關係
2 多對多
(1)訂單和商品關係,一個訂單裡面有多個商品,一個商品屬於多個訂單
(2)使用者和角色多對多關係
- 使用者: 小王、小馬、小宋
- 角色:總經理、祕書、司機、保安
** 比如小王 可以 是總經理,可以是司機
** 比如小宋 可以是司機,可以是祕書,可以保安
** 比如小馬 可以是 祕書,可以是總經理
- 一個使用者裡面可以有多個角色,一個角色裡面可以有多個使用者
(3)多對多建表:建立第三張表維護關係
3 一對一
(1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫
四、Hibernate的一對多操作(重點)
1.一對多對映配置(重點)
以客戶和聯絡人為例:客戶是一,聯絡人是多
第一步 建立兩個實體類,客戶和聯絡人
第二步 讓兩個實體類之間互相表示
(1)在客戶實體類裡面表示多個聯絡人
- 一個客戶裡面有多個聯絡人
(2)在聯絡人實體類裡面表示所屬客戶
- 一個聯絡人只能屬於一個客戶
第三步 配置對映關係
(1)一般一個實體類對應一個對映檔案
(2)把對映最基本配置完成
(3)在對映檔案中,配置一對多關係
- 在客戶對映檔案中,表示所有聯絡人
- 在聯絡人對映檔案中,表示所屬客戶
第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中
測試:
2.一對多級聯操作
級聯操作
1 級聯儲存
(1)新增一個客戶,為這個客戶新增多個聯絡人
2 級聯刪除
(1)刪除某一個客戶,這個客戶裡面的所有的聯絡人也刪除
3.一對多級聯儲存
1 新增客戶,為這個客戶新增一個聯絡人
(1)複雜寫法:
//演示一對多級聯儲存 @Test public void testAddDemo1() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { //得到sessionFactory sessionFactory = HibernateUtils.getSessionFactory(); //得到session session = sessionFactory.openSession(); //開啟事務 tx = session.beginTransaction(); // 新增一個客戶,為這個客戶新增一個聯絡人 //1 建立客戶和聯絡人物件 Customer customer = new Customer(); customer.setCustName("傳智播客"); customer.setCustLevel("vip"); customer.setCustSource("網路"); customer.setCustPhone("110"); customer.setCustMobile("999"); LinkMan linkman = new LinkMan(); linkman.setLkm_name("lucy"); linkman.setLkm_gender("男"); linkman.setLkm_phone("911"); //2 在客戶表示所有聯絡人,在聯絡人表示客戶 // 建立客戶物件和聯絡人物件關係 //2.1 把聯絡人物件 放到客戶物件的set集合裡面 customer.getSetLinkMan().add(linkman); //2.2 把客戶物件放到聯絡人裡面 linkman.setCustomer(customer); //3 儲存到資料庫 session.save(customer); session.save(linkman); //提交事務 tx.commit(); }catch(Exception e) { tx.rollback(); }finally { session.close(); //sessionFactory不需要關閉 sessionFactory.close(); } }
(2)簡化寫法
- 一般根據客戶新增聯絡人
第一步 在客戶對映檔案中進行配置
- 在客戶對映檔案裡面set標籤進行配置
第二步 建立客戶和聯絡人物件,只需要把聯絡人放到客戶裡面就可以了,最終只需要儲存客戶就可以了
//演示一對多級聯儲存 @Test public void testAddDemo2() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { //得到sessionFactory sessionFactory = HibernateUtils.getSessionFactory(); //得到session session = sessionFactory.openSession(); //開啟事務 tx = session.beginTransaction(); // 新增一個客戶,為這個客戶新增一個聯絡人 //1 建立客戶和聯絡人物件 Customer customer = new Customer(); customer.setCustName("百度"); customer.setCustLevel("普通客戶"); customer.setCustSource("網路"); customer.setCustPhone("110"); customer.setCustMobile("999"); LinkMan linkman = new LinkMan(); linkman.setLkm_name("小巨集"); linkman.setLkm_gender("男"); linkman.setLkm_phone("911"); //2 把聯絡人放到客戶裡面 customer.getSetLinkMan().add(linkman); //3 儲存客戶 session.save(customer); //提交事務 tx.commit(); }catch(Exception e) { tx.rollback(); }finally { session.close(); //sessionFactory不需要關閉 sessionFactory.close(); } }
4.一對多級聯刪除
1 刪除某個客戶,把客戶裡面所有的聯絡人刪除
2 具體實現
第一步 在客戶對映檔案set標籤,進行配置
(1)使用屬性cascade屬性值 delete
第二步 在程式碼中直接刪除客戶
(1)根據id查詢物件,呼叫session裡面delete方法刪除
3 執行過程:
(1)根據id查詢客戶
(2)根據外來鍵id值查詢聯絡人
(3)把聯絡人外來鍵設定為null
(4)刪除聯絡人和客戶
5.一對多修改操作(inverse屬性)
1 讓lucy聯絡人所屬客戶不是傳智播客,而是百度
2 inverse屬性
(1)因為hibernate雙向維護外來鍵,在客戶和聯絡人裡面都需要維護外來鍵,修改客戶時候修改一次外來鍵,修改聯絡人時候也修改一次外來鍵,造成效率問題
(2)解決方式:讓其中的一方不維護外來鍵
- 一對多裡面,讓其中一方放棄外來鍵維護
- 一個國家有總統,國家有很多人,總統不能認識國家所有人,國家所有人可以認識總統
(3)具體實現:
在放棄關係維護對映檔案中,進行配置,在set標籤上使用inverse屬性
五、Hibernate多對多操作
1.多對多對映配置
以使用者和角色為例演示
第一步 建立實體類,使用者和角色
第二步 讓兩個實體類之間互相表示
(1)一個使用者裡面表示所有角色,使用set集合
(2)一個角色有多個使用者,使用set集合
第三步 配置對映關係
(1)基本配置
(2)配置多對多關係
- 在使用者裡面表示所有角色,使用set標籤
在角色裡面表示所有使用者,使用set標籤
第四步 在核心配置檔案中引入對映檔案
測試:
2.多對多級聯儲存
根據使用者儲存角色
第一步 在使用者配置檔案中set標籤進行配置,cascade值save-update
第二步 寫程式碼實現
(1)建立使用者和角色物件,把角色放到使用者裡面,最終儲存使用者就可以了
//演示多對多修級聯儲存 @Test public void testSave() { SessionFactory sessionFactory = null; Session session = null; Transaction tx = null; try { //得到sessionFactory sessionFactory = HibernateUtils.getSessionFactory(); //得到session session = sessionFactory.openSession(); //開啟事務 tx = session.beginTransaction(); //新增兩個使用者,為每個使用者新增兩個角色 //1 建立物件 User user1 = new User(); user1.setUser_name("lucy"); user1.setUser_password("123"); User user2 = new User(); user2.setUser_name("mary"); user2.setUser_password("456"); Role r1 = new Role(); r1.setRole_name("總經理"); r1.setRole_memo("總經理"); Role r2 = new Role(); r2.setRole_name("祕書"); r2.setRole_memo("祕書"); Role r3 = new Role(); r3.setRole_name("保安"); r3.setRole_memo("保安"); //2 建立關係,把角色放到使用者裡面 // user1 -- r1/r2 user1.getSetRole().add(r1); user1.getSetRole().add(r2); // user2 -- r2/r3 user2.getSetRole().add(r2); user2.getSetRole().add(r3); //3 儲存使用者 session.save(user1); session.save(user2); //提交事務 tx.commit(); }catch(Exception e) { tx.rollback(); }finally { session.close(); //sessionFactory不需要關閉 sessionFactory.close(); } }
3.多對多級聯刪除(瞭解)
第一步 在set標籤進行配置,cascade值delete
第二步 刪除使用者
4.維護第三張表關係
1 使用者和角色多對多關係,維護關係通過第三張表維護
2 讓某個使用者有某個角色
第一步 根據id查詢使用者和角色
第二步 把角色放到使用者裡面
(1)把角色物件放到使用者set集合
3 讓某個使用者沒有某個角色
第一步 根據id查詢使用者和角色
第二步 從使用者裡面把角色去掉
(1)從set集合裡面把角色移除