1. 程式人生 > >hibernate的inverse屬性值的設定

hibernate的inverse屬性值的設定

  1. 多對多關係注意事項
    1.1 一定要定義一個主控方
    1.2 多對多刪除
    1.2.1 主控方直接刪除
    1.2.2 被控方先通過主控方解除多對多關係,再刪除被控方
    1.2.3 禁用級聯刪除
    1.3 關聯關係編輯,不需要直接操作橋接表,hibernate的主控方會自動維護

案例:級聯新增 級聯刪除 (inverse屬性值的設定)

 * 填寫書本解析,勾選型別複選框,提交
 * 如在hibernate 裡需呼叫bookDao.add
 * 四種做法:
 * 	inverse屬性 一般使用 兩種:true false  false true
 * 如:
 * book.hbm.xml :false
 * category.hbm.xml true
 * 代表的是:將維護關係(中間表)的責任給book
 *  book.hbm.xml : true
 * category.hbm.xml : true
 * 出現的情況:中間表無物件維護
 * 	book.hbm.xml : false
 * category.hbm.xml : false
 * 出現的情況:中間表出現兩條資料(hibernate的版本不同會有差異)
 * 注意一點:
 * hibernate是通過持久化物件來操作資料庫
 *
 * 主控方刪除
 * 結論是一併刪除從表關聯的中間表資訊刪除




 * 被控方處理中間表刪除
 * 結論是失敗
 * 原因:因為被控方被中間表所引用
 * 解決方案
 * 1.解除關聯關係(先刪除中間表引用資料),再去刪除主表資訊
 * dao方法程式碼演示:
	@Override
	public void deleteCategory(Category category) {
		Session session = HibernateUtli.getCurrentSession();
		Transaction transaction = session.beginTransaction();
		try {
			Category t = session.get(Category.class, category.getCategory_id());
			//t儲存著與某一些書籍相關聯的關係
			for (Book b : t.getBooks()) {
				//注意:關係交於主控方維護(book)
				b.getCategorys().remove(t);
			}
			session.delete(t);
			transaction.commit();
		} catch (Exception e) {
			e.printStackTrace();
			transaction.rollback();
			throw new RuntimeException("刪除出現異常");
		}
		HibernateUtli.closeSession();
	}