hibernate 多對多2
阿新 • • 發佈:2018-12-18
1、 多對多關係注意事項 1.1 一定要定義一個主控方 1.2 多對多刪除 1.2.1 主控方直接刪除 1.2.2 被控方先通過主控方解除多對多關係,再刪除被控方 1.2.3 禁用級聯刪除(all,save-delete會把相關聯的資料全部刪除) 3.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護 案例: 級聯新增 inverse屬性值的設定
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; }
測試
* 級聯新增 * 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); }
級聯刪除
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(); } ----------------------------------------------- junit測試 */ @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);