1. 程式人生 > >2018-10-28 多對多2

2018-10-28 多對多2

級聯新增

 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的主控方會自動維護