hibernate的自关联和多对多

1、数据库的多对多
数据库中不能直接映射多对多
处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多

注1:数据库多表联接查询
永远就是二个表的联接查询
注2:交叉连接
注3:外连接:left(左)/right(右)/full(左右)
主从表:连接条件不成立时,主表记录永远保留,与null匹配

2、hibernate的多对多
1、hibernate可以直接映射多对多关联关系(看作两个一对多)
2、级联新增
inverse属性
inverse:反方
book.hbm.xml:inverse=false
category,hbm.xml:inverse=true
这两种方式都指的是将级联关系维护的责任交给book对象
jdbc级联新增需要调2个道方法:
this.bookDao.add
this.bookCategoryDao.add

而hibernate只需要一个即可达到效果:
this.bookDao.add

级联新增可能出现的错误:

在这里插入图片描述

假如在级联增加书籍跟类别时,增加的类别是new出来的话,它会报错
      eg:Book book = new Book();
      book.setBookName("时光不老,我们不散");
      book.setPrice(45f);
      Category category = new Category();
      category.setCategoryId(7);
      book.getCategories().add(category);//这是临时态的
      在多对多的关系维护中,hibernate管理的是持久态对象
      应该改为
      book.getCategories().add(this,categoryDao.get(category));
      
      this.bookDao.add(book);

3.级联删除
①:一定要定义一个主控方
②:主控方直接删除
jdbc:
this.bookCategoryDao.delete
this.bookDao.delete
hibernate:
this.bookDao.delete
③:被控方删除
(1):被控方先通过主控方解除多对多关系
book.getCategories().remove(category);
(2):再删除被控方

4.禁用级联删除
cascade=“all”
all=update、save、delete
禁用级联删除把 cascade属性 改为 cascade=“save-update” 即可

5.关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护

猜你喜欢

转载自blog.csdn.net/cg_9647/article/details/83510875