hibernate:多對多02
阿新 • • 發佈:2018-12-18
1、 多對多關係注意事項
1.1 一定要定義一個主控方 1.2 多對多刪除 1.2.1 主控方直接刪除 1.2.2 被控方先通過主控方解除多對多關係,再刪除被控方 1.2.3 禁用級聯刪除(all,save-delete會把相關聯的資料全部刪除) 3.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護
案例: 級聯新增 inverse屬性值的設定
Dao 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; } public Integer addBook(Book book) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); Integer bid = (Integer) session.save(book); transaction.commit(); session.close(); return bid; }
test /** * 級聯新增 * book.hbm.xml:inverse=false; * category.hbm.xml:inverse=true; * inverse:反方 * 指的是將級聯關係的維護的責任交給book物件。 * * * jdbc:this.bookDao.add * this.bookCategoryDao.add * hibernate:this.bookDao.add * * Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'category_name' cannot be null * 在多對多的關係維護中,hibernate管理的是持久態物件 */ @Test public void testAdd1() { Book book=new Book(); book.setBookName("不死不滅"); book.setPrice(40f); Category category=new Category();//臨時態 category.setCategoryId(2); // book.getCategories().add(category); book.getCategories().add(this.categoryDao.get(category));//持久態 this.bookDao.addBook(book); } /** * 新增一個新的類別,繫結原有的某個書籍 * 只能增加類別,中間表沒有資料增加進去,要想增加進去,把category:inverse:false,book:inverse:true * 如果 book.hbm.xml:inverse=false; * category.hbm.xml:inverse=false,那麼中間表就會資料重複 */ @Test public void testAdd2() { Category category=new Category(); category.setCategoryName("仙俠"); Book book=new Book(); book.setBookId(5); 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() { Book book=new Book(); book.setBookName("不死不滅1"); book.setPrice(40f); Category category=new Category(); category.setCategoryId(2); book.getCategories().add(this.categoryDao.get(category));//持久態 this.bookDao.addBook(book); }
級聯刪除
Dao } public void del(Book book) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); session.delete(book); transaction.commit(); session.close(); } /** * 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
/**
* 主控方刪除
* 需求:刪除有關聯關係的一本書
* 刪除不死不滅的這本書,目前這本書在中間表引用
* jdbc:this.bookCategoryDao.delete
* this.bookDao.delete
*
* hibernate:this.bookDao.delete
*/
@Test
public void testDel1() {
Book book=new Book();
book.setBookId(5);
this.bookDao.del(book);
}
/**
* 被控方刪除(刪除類別)
* 需求:刪除有關聯關係的一個類別,包括類別下的所有書籍
* 刪除仙俠這個類別,目前這個類別在中間表引用
*/
@Test
public void testDel2() {
Category category=new Category();
category.setCategoryId(4);
this.categoryDao.del(category);
}