Hibernate_day03---表與表關係建立、一對多配置及操作、多對多配置及操作
阿新 • • 發佈:2018-11-03
一、表與表關係建立思路
一對多關係
關係舉例:
(1)分類和商品關係。
一個分類裡面有多個商品,一個商品只能屬於一個分類
(2)公司和員工關係
一個公司有多個員工,每個員工屬於一個公司
一對多建表:通過外來鍵建立關係
圖示:
多對多關係
關係舉例:
(1) 人與角色關係
一個人有多個角色(學生,兒子,青年),一個角色可以有多個人(張三、李四、王五)
多對多建表:建立第三張表維護關係
圖示
二、一對多環境配置
客戶和聯絡人:客戶是一,聯絡人是多。
第一步 建立兩個實體類,客戶和聯絡人。
//客戶 public class Customer { private Integer cid; //客戶id private String custName; //客戶名稱 private String custLevel; //客戶級別 private String custSource; //客戶來源 private String custPhone; //聯絡電話 private String custMobile; //手機 } //聯絡人 public class LinkMan { private Integer lkm_id; // 聯絡人編號(主鍵) private String lkm_name;// 聯絡人姓名 private String lkm_gender;// 聯絡人性別 private String lkm_phone;// 聯絡人辦公電話 }
第二步 讓兩個實體類之間互相表示
//Hibernate要求用Set集合存放多的一方,泛型為多的類。 //多對一中的一 (客戶) private Set<LinkMan> setLinkMan = new HashSet<LinkMan>(); public Set<LinkMan> getSetLinkMan() { return setLinkMan; } public void setSetLinkMan(Set<LinkMan> setLinkMan) { this.setLinkMan = setLinkMan; } //在多中,建立一的類。用來表示所屬關係 (一個聯絡人只能有一個客戶) //多對一中的多(聯絡人) private Customer customer; public Customer getCustomer() { return customer; } public void setCustomer(Customer customer) { this.customer = customer; }
第三步 配置對映關係
1)完成基本配置(每個實體類分別對應一個對映檔案)
2)配置一對多對映關係(使用set標籤)
在客戶對映檔案中,表示所有聯絡人
在聯絡人對映檔案中,表示所屬客戶
第四步 建立核心配置檔案,把對映檔案引入到核心配置檔案中
建表,測試配置
三、一對多級聯操作
級聯儲存
(1)複雜寫法: /** * HibernateOneToMany * 新增客戶新增聯絡人測試 * * @author 一萬年行不行 */ public class HibernateOneToMany { SessionFactory sessionFactory = null; Session session = null; Transaction transaction = null; @Test public void oneToMany(){ try{ //1.得到sessionFactory建立表. sessionFactory = HibernateUtils.getSessionFactory(); //2.得到session session = sessionFactory.openSession(); //3.呼叫session開啟事務 transaction = session.beginTransaction(); /* * 4.業務邏輯---新增客戶 * * 1.建立客戶、 * 2.建立聯絡人、 * 3.將聯絡人設定到客戶、 * 4.為聯絡人設定客戶 * 5.儲存到資料庫 */ //建立客戶 Customer customer = new Customer(); customer.setCustName("百度"); customer.setCustLevel("vip"); customer.setCustSource("網路"); customer.setCustPhone("123456"); customer.setCustMobile("5555"); //建立聯絡人 LinkMan linkman = new LinkMan(); linkman.setLkm_name("lucy"); linkman.setLkm_gender("男"); linkman.setLkm_phone("911"); //將聯絡人設定到客戶、 customer.getSetLinkMan().add(linkman); //為聯絡人設定客戶 linkman.setCustomer(customer); //儲存到資料庫 session.save(customer); session.save(linkman); //5.提交事務 transaction.commit(); }catch(Exception e){ //5.事務回滾 transaction.rollback(); }finally{ //6.關閉資源 session.close(); //sessionFactory.close(); } } }
測試
(2)簡化寫法
簡化內容:只需要在客戶新增聯絡人即可,不再需要雙向儲存
級聯刪除
第一步 在客戶對映檔案set標籤,進行配置
使用屬性cascade屬性值 delete
第二步 在程式碼中直接刪除客戶
根據id查詢物件,呼叫session裡面delete方法刪除
修改操作(inverse屬性)
(1)因為hibernate雙向維護外來鍵。
導致系統需要修改兩次外來鍵(客戶和聯絡人都需要維護外來鍵),造成效率問題
(2)解決方式:讓其中的一方不維護外來鍵(多對一中的一)
四、多對多對映配置
以使用者和角色為例演示
第一步 建立實體類,使用者和角色
第二步 讓兩個實體類之間互相表示
(1)一個使用者裡面表示所有角色,使用set集合
(2)一個角色有多個使用者,使用set集合
第三步 配置對映關係
(1)基本配置
(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();
}
}
級聯刪除
第一步 在set標籤進行配置,cascade值delete
第二步 刪除使用者
#六、維護第三張表關係
使用者和角色多對多關係,維護關係通過第三張表維護
1)產生關係
第一步 根據id查詢使用者和角色
第二步 把角色放到使用者裡面
2)刪除關係
第一步 根據id查詢 使用者和角色
第二步 去掉使用者中的角色