hibernate的多對多(02)和級聯刪除(06)
阿新 • • 發佈:2018-12-18
-
資料庫的多對多 1.1 資料庫中不能直接對映多對多 處理:建立一個橋接表(中間表),將一個多對多關係轉換成兩個一對多
注1:資料庫多表聯接查詢 永遠就是二個表的聯接查詢
A B C D t1 C t2 D t3
注2:交叉連線 注3:外連線:left(左)/right(右)/full(左右) 主從表:連線條件不成立時,主表記錄永遠保留,與null匹配
A B AB select * from A,B,AB WHERE A.aID=AB.aID and b.bid = AB.bid where 在hibernate中,你只管查詢當前表物件即可, hibernate會欄位關聯橋表以及關聯表查詢出關聯物件
-
hibernate的多對多 2.1 hibernate可以直接對映多對多關聯關係(看作兩個一對多)
-
多對多關係注意事項 3.1 一定要定義一個主控方 3.2 多對多刪除 3.2.1 主控方直接刪除 3.2.2 被控方先通過主控方解除多對多關係,再刪除被控方 3.2.3 禁用級聯刪除 3.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護 注:書本和類別全部關聯了。刪除一本書, 會全部清空,
案例: 級聯新增 inverse屬性值的設定 級聯刪除
public Integer add(Book book){ Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); Integer bid = (Integer) session.save(book); transaction.commit(); session.close(); return bid; } public void del(Book book){ Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); session.delete(book); transaction.commit(); session.close(); }
public Integer add(Category category){ Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); Integer cid = (Integer) session.save(category); transaction.commit(); session.close(); return cid; } /** * 1、被控方通過主控方來解除關聯關係 * 2、再去刪除被控方 * @param category */ public void del(Category category){ Session session = SessionFactoryUtil.getSession(); Transaction transaction = session.beginTransaction(); Category c=session.get(Category.class, category.getCategoryId()); for(Book b:c.getBooks()){ // c.getBooks().remove(b);//這樣是刪不掉的,被控方是不具備這樣的權利的 b.getCategories().remove(c); } session.delete(c); transaction.commit(); session.close(); }
/**
* 級聯新增
* book.hbm.xml:inverse=false
* category.hbm.xml:inverse=true
* inverse:反方
* 指的是將級聯關係的維護的責任交給book物件
*
* jdbc:
* this.bookDao.add
* this.BookCategoryDao.add
*
* 在多對多的關係維護中,hibernate管理的是持久態物件
*/
@Test
public void testAdd1() {
Book book=new Book();
book.setBookName("鬥破蒼穹");
book.setPrice(45f);
Category category=new Category();
category.setCategoryId(3);
book.getCategories().add(this.categoryDao.get(category));
this.bookDao.add(book);
}
/**
* 新增一個新的類別,繫結原有的某個書籍
* 不報錯,但是中間表重複,版本原因,不維護關係。
* 我這個顯示不了,如果中間表出現重複,那就是2個false的原因。
*/
@Test
public void testAdd2() {
Category category=new Category();
category.setCategoryName("仙俠");
category.setCategoryId(8);
Book book=new Book();
book.setBookId(6);
category.getBooks().add(this.bookDao.get(book));
this.categoryDao.add(category);
}
/**
* book.hbm.xml:inverse=true
* category.hbm.xml:inverse=true*/
@Test
public void testAdd3() {
// Book book=new Book();
// book.setBookName("鬥破蒼穹2");
// book.setPrice(45f);
// Category category=new Category();
// category.setCategoryId(3);
// book.getCategories().add(this.categoryDao.get(category));
// this.bookDao.add(book);
Category category=new Category();
category.setCategoryName("仙俠1");
Book book=new Book();
book.setBookId(6);
category.getBooks().add(this.bookDao.get(book));
this.categoryDao.add(category);
}
/**
* 主控方刪除
* 需求:刪除有關聯關係的一本書
* 刪除鬥破蒼穹的這本書,目前這本書在中間表引用了3
* jdbc:
* this.this.categoryDao.delete
* this.bookDao.delete
* hibernate
* this.bookDao.delete
*/
@Test
public void testDel1(){
Book book=new Book();
book.setBookId(7);
this.bookDao.del(book);
}
/**
* 被控方刪除
* 需求:刪除有關聯關係的一本書 包括該類別下的所有書籍
* 刪除歷史的這本書,目前這本書在中間表引用
*/
@Test
public void testDel2(){
Category category=new Category();
category.setCategoryId(3);
this.categoryDao.del(category);
}
注:如有看不懂,看前一篇部落格,inverse是hbm.xml裡面set標籤的。切記,只要有一個主控方即可。一個false,一個true