1. 程式人生 > >hibernate多對多關係的新增與刪除

hibernate多對多關係的新增與刪除

程式碼
bookdao

public Integer save(Book book) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		Integer bid = (Integer) session.save(book);
		transaction.commit();
		SessionFactoryUtils.closeSession();
		return bid;
	}

public void del(Book book) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		session.delete(book);
		transaction.commit();
		SessionFactoryUtils.closeSession();
	}
	

categorydao

public Integer save(Category category) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		Integer cid = (Integer) session.save(category);
		transaction.commit();
		SessionFactoryUtils.closeSession();
		return cid;
	} 
	
	/**
	 * 被控方刪除失敗   因為被控方被中間表所引用
	 * 
	 * 1,解除關聯關係(先刪除中間表的引用資料)
	 * 2,再刪除主表資訊
	 * @param category
	 */
	public void del(Category category) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
//		session.delete(category);直接刪除失敗
		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();
		SessionFactoryUtils.closeSession();
	} 

bookTest

/**
	 * hibernate通過操作持久態物件來操作資料庫
	 * 配置檔案中配置的是把關係交給book管理
	 */
	@Test
	public void testSave() {
		//新增一本書籍
		Book book = new Book();
		book.setBookName("最好的我們");
		book.setPrice(100f);
		Category c = new Category();
		c.setCategoryId(4);
//		book.getCategories().add(c);這個時候的Category是臨時態的物件
		book.getCategories().add(this.categoryDao.getCategory(c));
		bookdao.save(book);
	}


@Test
	public void testSave2() {
		//把關係交給書籍型別管理
		Category c = new Category();
		c.setCategoryName("言情");
		Book book = new Book();
		book.setBookId(1);
		c.getBooks().add(bookdao.getBook(book));
		categoryDao.save(c);
	}


/**
	 * 主控方的刪除
	 * 結果:一併將從表關聯的中間表資訊刪除 
	 */
	@Test
	public void testDel() {
		Book book = new Book();
		book.setBookId(1);
		bookdao.del(book);
	}
	
	
	/**
	 * 被控方的刪除
	 * 
	 */
	@Test
	public void testDel2() {
		Category c = new Category();
		c.setCategoryId(4);
		categoryDao.del(c);
	}