0 列表功能實現數據庫
1 表與表之間關係回顧網絡
(1)一對多(客戶和聯繫人)session
(2)多對多(用戶和角色)測試
2 hibernate一對多操做spa
(1)一對多映射配置hibernate
(2)一對多級聯保存3d
(3)一對多級聯刪除code
(4)inverse屬性對象
3 hibernate多對多操做blog
(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)客戶和聯繫人是一對多關係
- 客戶:與公司有業務往來,百度、新浪、360
- 聯繫人:公司裏面的員工,百度裏面有不少員工,聯繫員工
** 公司和公司員工的關係
- 客戶是一,聯繫人是多
- 一個客戶裏面有多個聯繫人,一個聯繫人只能屬於一個客戶
(3)一對多建表:經過外鍵創建關係
2 多對多
(1)訂單和商品關係,一個訂單裏面有多個商品,一個商品屬於多個訂單
(2)用戶和角色多對多關係
- 用戶: 小王、小馬、小宋
- 角色:總經理、祕書、司機、保安
** 好比小王 能夠 是總經理,能夠是司機
** 好比小宋 能夠是司機,能夠是祕書,能夠保安
** 好比小馬 能夠是 祕書,能夠是總經理
- 一個用戶裏面能夠有多個角色,一個角色裏面能夠有多個用戶
(3)多對多建表:建立第三張表維護關係
3 一對一
(1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫
以客戶和聯繫人爲例:客戶是一,聯繫人是多
第一步 建立兩個實體類,客戶和聯繫人
第二步 讓兩個實體類之間互相表示
(1)在客戶實體類裏面表示多個聯繫人
- 一個客戶裏面有多個聯繫人
(2)在聯繫人實體類裏面表示所屬客戶
- 一個聯繫人只能屬於一個客戶
第三步 配置映射關係
(1)通常一個實體類對應一個映射文件
(2)把映射最基本配置完成
(3)在映射文件中,配置一對多關係
- 在客戶映射文件中,表示全部聯繫人
- 在聯繫人映射文件中,表示所屬客戶
第四步 建立核心配置文件,把映射文件引入到核心配置文件中
測試:
級聯操做
1 級聯保存
(1)添加一個客戶,爲這個客戶添加多個聯繫人
2 級聯刪除
(1)刪除某一個客戶,這個客戶裏面的全部的聯繫人也刪除
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(); } }
1 刪除某個客戶,把客戶裏面全部的聯繫人刪除
2 具體實現
第一步 在客戶映射文件set標籤,進行配置
(1)使用屬性cascade屬性值 delete
第二步 在代碼中直接刪除客戶
(1)根據id查詢對象,調用session裏面delete方法刪除
3 執行過程:
(1)根據id查詢客戶
(2)根據外鍵id值查詢聯繫人
(3)把聯繫人外鍵設置爲null
(4)刪除聯繫人和客戶
1 讓lucy聯繫人所屬客戶不是傳智播客,而是百度
2 inverse屬性
(1)由於hibernate雙向維護外鍵,在客戶和聯繫人裏面都須要維護外鍵,修改客戶時候修改一次外鍵,修改聯繫人時候也修改一次外鍵,形成效率問題
(2)解決方式:讓其中的一方不維護外鍵
- 一對多裏面,讓其中一方放棄外鍵維護
- 一個國家有總統,國家有不少人,總統不能認識國家全部人,國家全部人能夠認識總統
(3)具體實現:
在放棄關係維護映射文件中,進行配置,在set標籤上使用inverse屬性
以用戶和角色爲例演示
第一步 建立實體類,用戶和角色
第二步 讓兩個實體類之間互相表示
(1)一個用戶裏面表示全部角色,使用set集合
(2)一個角色有多個用戶,使用set集合
第三步 配置映射關係
(1)基本配置
(2)配置多對多關係
- 在用戶裏面表示全部角色,使用set標籤
在角色裏面表示全部用戶,使用set標籤
第四步 在覈心配置文件中引入映射文件
測試:
根據用戶保存角色
第一步 在用戶配置文件中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(); } }
第一步 在set標籤進行配置,cascade值delete
第二步 刪除用戶
1 用戶和角色多對多關係,維護關係經過第三張表維護
2 讓某個用戶有某個角色
第一步 根據id查詢用戶和角色
第二步 把角色放到用戶裏面
(1)把角色對象放到用戶set集合
3 讓某個用戶沒有某個角色
第一步 根據id查詢用戶和角色
第二步 從用戶裏面把角色去掉
(1)從set集合裏面把角色移除