2018-10-28 多對多2
阿新 • • 發佈:2018-12-18
級聯新增
book.hbm.xml:inverse=false;
category.hbm.xml:inverse=true;
inverse:反方
指的是將級聯關係的維護的責任交給false一方的物件。
以往jdbc: * this.bookDao.add * this.bookCategoryDao.add hibernate * this.bookDao.add 在多對多的關係維護中,hibernate管理的是永續性物件 第一種 dao
public Integer add(Book book) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); Integer bid = (Integer) session.save(book); transaction.commit(); session.close(); return bid; } public Integer add(Category category) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); Integer cid = (Integer) session.save(category); transaction.commit(); session.close(); return cid; }
test
@Test public void testAdd1() { Book book = new Book(); book.setBookName("不死不滅1"); book.setPrice(45f); Category category = new Category(); category.setCategoryId(7); //this.categoryDao.get(category)永久性物件 book.getCategories().add(this.categoryDao.get(category)); this.bookDao.add(book); }
第二種
/**inverse都是false * 新增一個新的類別,繫結原有的某個書籍 * 結果:只能新增類別表的資訊,中間表無新增 */ @Test public void testAdd2() { Category category = new Category(); category.setCategoryName("仙俠22"); Book book = new Book(); book.setBookId(7); category.getBooks().add(this.bookDao.get(book)); this.categoryDao.add(category); }
第三種 /** * book.hbm.xml:inverse=true; * category.hbm.xml:inverse=true; * 為true的一方都不維護關係 * 結果:同第二種 */ @Test public void testAdd3() { Category category = new Category(); category.setCategoryName(“仙俠”); Book book = new Book(); book.setBookId(8); category.getBooks().add(this.bookDao.get(book)); this.categoryDao.add(category); }
級聯刪除
dao
public void del(Book book) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
session.delete(book);
transaction.commit();
session.close();
}
test
/**
* 主控方刪除
* 需求:刪除有關聯的一本書
* 刪除不死不滅的這本書,目前這本是在中間表引用了玄幻
* jdbc:
* this.bookCategoryDao.delete
* this.bookDao.delete
*
* hibernate
* this.bookDao.delete
*/
@Test
public void testDel() {
Book book = new Book();
book.setBookId(8);
this.bookDao.del(book);
}
dao
/**
* 1、被控方通過主控方來接觸關聯關係
* 2、再去刪除被控方
* @param category
*/
public void del(Category category) {
Session session = SessionFactoryUtils.getSession();
Transaction transaction = session.beginTransaction();
Category c = session.get(Category.class, category.getCategoryId());
for(Book b:c.getBooks()) {
b.getCategories().remove(c);
}
session.delete(c);
transaction.commit();
session.close();
}
test
/**
* 被控方刪除
* 需求:刪除有關聯的一個類別,包括該類別下的所有書籍
* 刪除a1的這個類別,目前這個類別在中間表引用了玄幻
*/
@Test
public void testDel2() {
Category category = new Category();
category.setCategoryId(1);
this.categoryDao.del(category);
}
多對多關係注意事項
1、一定要定義一個主控方 2、多對多刪除 2.1 主控方直接刪除 2.2 被控方先通過主控方解除多對多關係,再刪除被控方 2.3 禁用級聯刪除 3、關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護