1. 程式人生 > >4天--Hibernate學習(day03)

4天--Hibernate學習(day03)

今天內容

0 列表功能實現

1 表與表之間關係回顧

1)一對多(客戶和聯絡人)

2)多對多(使用者和角色)

2 hibernate一對多操作

1)一對多對映配置

2)一對多級聯儲存

3)一對多級聯刪除

4inverse屬性

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();

returnlist;

       }

catch(Exception e) {

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標籤進行配置,cascadesave-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("