hibernate的inverse屬性值的設定
阿新 • • 發佈:2018-10-31
- 多對多關係注意事項
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(); }