Hibernate_day03

1、今天內容

0 列表功能實現數據庫

1 表與表之間關係回顧網絡

(1)一對多(客戶和聯繫人)session

(2)多對多(用戶和角色)測試

2 hibernate一對多操做spa

(1)一對多映射配置hibernate

(2)一對多級聯保存3d

(3)一對多級聯刪除code

(4)inverse屬性對象

3 hibernate多對多操做blog

(1)多對多映射配置

(2)多對多級聯保存(重點)

(3)多對多級聯刪除

(4)維護第三張表

2、客戶列表功能

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;
    }

3、表與表之間關係回顧(重點)

1 一對多

(1)分類和商品關係,一個分類裏面有多個商品,一個商品只能屬於一個分類

(2)客戶和聯繫人是一對多關係

- 客戶:與公司有業務往來,百度、新浪、360

- 聯繫人:公司裏面的員工,百度裏面有不少員工,聯繫員工

** 公司和公司員工的關係

- 客戶是一,聯繫人是多

- 一個客戶裏面有多個聯繫人,一個聯繫人只能屬於一個客戶

(3)一對多建表:經過外鍵創建關係

2 多對多

(1)訂單和商品關係,一個訂單裏面有多個商品,一個商品屬於多個訂單

(2)用戶和角色多對多關係

- 用戶: 小王、小馬、小宋

- 角色:總經理、祕書、司機、保安

** 好比小王 能夠 是總經理,能夠是司機

** 好比小宋 能夠是司機,能夠是祕書,能夠保安

** 好比小馬 能夠是 祕書,能夠是總經理

-          一個用戶裏面能夠有多個角色,一個角色裏面能夠有多個用戶

(3)多對多建表:建立第三張表維護關係

3 一對一

(1)在中國,一個男人只能有一個妻子,一個女人只能有一個丈夫

4、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屬性

 

5、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集合裏面把角色移除

相關文章
相關標籤/搜索