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

猜你喜欢

转载自blog.csdn.net/f_1314520/article/details/83445920