1. 程式人生 > >hibernate的自關聯和多對多

hibernate的自關聯和多對多

1、資料庫的多對多
資料庫中不能直接對映多對多
處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多

注1:資料庫多表聯接查詢
永遠就是二個表的聯接查詢
注2:交叉連線
注3:外連線:left(左)/right(右)/full(左右)
主從表:連線條件不成立時,主表記錄永遠保留,與null匹配

2、hibernate的多對多
1、hibernate可以直接對映多對多關聯關係(看作兩個一對多)
2、級聯新增
inverse屬性
inverse:反方
book.hbm.xml:inverse=false
category,hbm.xml:inverse=true
這兩種方式都指的是將級聯關係維護的責任交給book物件
jdbc級聯新增需要調2個道方法:
this.bookDao.add
this.bookCategoryDao.add

而hibernate只需要一個即可達到效果:
this.bookDao.add

級聯新增可能出現的錯誤:

在這裡插入圖片描述

假如在級聯增加書籍跟類別時,增加的類別是new出來的話,它會報錯
      eg:Book book = new Book();
      book.setBookName("時光不老,我們不散");
      book.setPrice(45f);
      Category category = new Category();
      category.setCategoryId(7);
      book.getCategories().add(category);//這是臨時態的
      在多對多的關係維護中,hibernate管理的是持久態物件
      應該改為
      book.getCategories().add(this,categoryDao.get(category));
      
      this.bookDao.add(book);

3.級聯刪除
①:一定要定義一個主控方
②:主控方直接刪除
jdbc:
this.bookCategoryDao.delete
this.bookDao.delete
hibernate:
this.bookDao.delete
③:被控方刪除
(1):被控方先通過主控方解除多對多關係
book.getCategories().remove(category);
(2):再刪除被控方

4.禁用級聯刪除
cascade=“all”
all=update、save、delete
禁用級聯刪除把 cascade屬性 改為 cascade=“save-update” 即可

5.關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護