4天--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 = sessionFactory.openSession(); //開啟事務 tx = session.beginTransaction(); //查詢所有記錄 Criteria criteria = session.createCriteria(Customer.class); List<Customer> list = criteria.list(); //提交事務 tx.commit(); returnlist; } tx.rollback(); }finally { session.close(); //sessionFactory不需要關閉 // sessionFactory.close(); } returnnull; } |
表與表之間關係回顧(重點)
1 一對多 (1)分類和商品關係,一個分類裡面有多個商品,一個商品只能屬於一個分類 (2)客戶和聯絡人是一對多關係 - 客戶:與公司有業務往來,百度、新浪、360 - 聯絡人:公司裡面的員工,百度裡面有很多員工,聯絡員工 ** 公司和公司員工的關係 - 客戶是一,聯絡人是多 - 一個客戶裡面有多個聯絡人,一個聯絡人只能屬於一個客戶 (3)一對多建表:通過外來鍵建立關係 2 多對多 (1)訂單和商品關係,一個訂單裡面有多個商品,一個商品屬於多個訂單 (2)使用者和角色多對多關係 - 使用者: 小王、小馬、小宋 - 角色:總經理、祕書、司機、保安 ** 比如小王 可以 是總經理,可以是司機 ** 比如小宋 可以是司機,可以是祕書,可以保安 ** 比如小馬 可以是 祕書,可以是總經理
(3)多對多建表:建立第三張表維護關係 3 一對一 (1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫 |
Hibernate的一對多操作(重點)
一對多對映配置(重點)
以客戶和聯絡人為例:客戶是一,聯絡人是多 第一步 建立兩個實體類,客戶和聯絡人 第二步 讓兩個實體類之間互相表示 (1)在客戶實體類裡面表示多個聯絡人 - 一個客戶裡面有多個聯絡人 (2)在聯絡人實體類裡面表示所屬客戶 - 一個聯絡人只能屬於一個客戶 第三步 配置對映關係 (1)一般一個實體類對應一個對映檔案 (2)把對映最基本配置完成 (3)在對映檔案中,配置一對多關係 - 在客戶對映檔案中,表示所有聯絡人 - 在聯絡人對映檔案中,表示所屬客戶 第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中 測試: |
一對多級聯操作
級聯操作 1 級聯儲存 (1)新增一個客戶,為這個客戶新增多個聯絡人 2 級聯刪除 (1)刪除某一個客戶,這個客戶裡面的所有的聯絡人也刪除 |
一對多級聯儲存
1 新增客戶,為這個客戶新增一個聯絡人 (1)複雜寫法: //演示一對多級聯儲存 @Test publicvoid 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 publicvoid 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(); } } |
一對多級聯刪除
1 刪除某個客戶,把客戶裡面所有的聯絡人刪除 2 具體實現 第一步 在客戶對映檔案set標籤,進行配置 (1)使用屬性cascade屬性值 delete 第二步 在程式碼中直接刪除客戶 (1)根據id查詢物件,呼叫session裡面delete方法刪除 3 執行過程: (1)根據id查詢客戶 (2)根據外來鍵id值查詢聯絡人 (3)把聯絡人外來鍵設定為null (4)刪除聯絡人和客戶 |
一對多修改操作(inverse屬性)
1 讓lucy聯絡人所屬客戶不是傳智播客,而是百度 2 inverse屬性 (1)因為hibernate雙向維護外來鍵,在客戶和聯絡人裡面都需要維護外來鍵,修改客戶時候修改一次外來鍵,修改聯絡人時候也修改一次外來鍵,造成效率問題 (2)解決方式:讓其中的一方不維護外來鍵 - 一對多裡面,讓其中一方放棄外來鍵維護 - 一個國家有總統,國家有很多人,總統不能認識國家所有人,國家所有人可以認識總統 (3)具體實現: 在放棄關係維護對映檔案中,進行配置,在set標籤上使用inverse屬性 |
Hibernate多對多操作
多對多對映配置
以使用者和角色為例演示 第一步 建立實體類,使用者和角色 第二步 讓兩個實體類之間互相表示 (1)一個使用者裡面表示所有角色,使用set集合 (2)一個角色有多個使用者,使用set集合 第三步 配置對映關係 (1)基本配置 (2)配置多對多關係 - 在使用者裡面表示所有角色,使用set標籤 - 在角色裡面表示所有使用者,使用set標籤 第四步 在核心配置檔案中引入對映檔案 測試: |
多對多級聯儲存
根據使用者儲存角色 第一步在使用者配置檔案中set標籤進行配置,cascade值save-update 第二步寫程式碼實現 (1)建立使用者和角色物件,把角色放到使用者裡面,最終儲存使用者就可以了 //演示多對多修級聯儲存 @Test publicvoid 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(" |