级联新增inverse=“false”或inverse=“true”的三种方式
第一种:
借助book.hbm.xml :inverse=“false” ,category.hbm.xml : inverse =“true” 来讲
在这两个xml配置文件中,一false一true 的意思是指将级联关系的维护的责任交给book对象
inverse是相反的意思,book.hbm.xml :inverse=“false” 这句代码在问是否将桥接表的数据交给反方维护吗? 这里的反方是category,false,则是自己book维护。category 中inverse=“true”则是book维护,所以Book表是主控方
写一个简答的dao方法
public Integer addBook(Book book) { Session session = SessionFactoryUtils.getSession(); Transaction transaction = session.beginTransaction(); Integer bid = (Integer) session.save(book); transaction.commit(); session.close(); return bid; } |
因为category是new出来的,所以是临时状态,而在多对多的关系中,hibernate管理的是持久态对象,因此打勾勾的是正确的,这样关联的数据才能加进去。
@Test public void testAdd1() { Book book = new Book(); book.setPrice(45f); book.setBookName("不死不灭2"); Category category = new Category(); category.setCategoryId(2); //此时category是临时状态 hibernate管理的是持久态对象 // book.getCategorys().add(category); //x book.getCategorys().add(this.categoryDao.getCategory(category));//√ this.booDao.addBook(book); } |
第二种
借助book.hbm.xml :inverse=“true” ,category.hbm.xml : inverse =“true” 来讲
两个配置文件都为true,那么就相当于两人吃完饭,都要对方付钱,
那么当你添加级联新增数据时,不会报错,数据会加进去,但不会维护桥接表
第三种:
借助book.hbm.xml :inverse=“false” ,category.hbm.xml : inverse =“false” 来讲
两个配置文件都为false,那么就相当于两人吃完饭,都自己付钱,
那么当你添加级联新增数据时,不会报错,数据会加进去,但不会维护桥接表
这两种都是一样的结果,都不会维护桥接表。
级联删除
级联删除的主控方可以直接删除有关联关系的书,且在桥接表中有引用
比如直接删除一本不死不灭的书,这本书关联的是玄幻额类别,在桥接表中有引用
那么如果一类别玄幻能删除与这一类别有关联的书籍吗? 答案是不能删除
因为类别是被控方,,那么被控方是通过什么在删除这样的关联关系呢?
被控方删除:
被控方通过主控方解除关联关系,再去删除被控方。
public void del(Category category) { |
总结:多对多关系注意事项
1 一定要定义一个主控方
2 多对多删除
2.1 主控方直接删除
2.2 被控方先通过主控方解除多对多关系,再删除被控方
2.3 禁用级联删除
3 关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护