- 多对多关系注意事项
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();
}