1. 程式人生 > >hibernate:多對多02

hibernate:多對多02

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);
	}