/**
* 被控方删除失败的原因?
* 因为被控方被中间表所引用
*
* 1、接触关联关系(先删除中间表的引用数据)
* 2、再去删除主表信息
* @param category
*/
public void del(Category category) {
Session session = SessionFactoryUtil.getSession();
Transaction transaction = session.beginTransaction();
Category c = session.get(Category.class, category.getCategoryId());
//c里面保存着与某一些书籍相关联的关系
for(Book b:c.getBooks()) {
//注意:关系交于book维护
// c.getBooks().remove(b);
b.getCategories().remove©;
}
session.delete©;
transaction.commit();
session.close();
}
/**填写书本歇息,勾选复选框类别,提交
* jdbc:bookDao.add,bookCategoryDao.add
* hibernate:bookDao.add
* 四种做法
* 讲解inverse属性 两种
* true false
* false true
* book.hbm:false
* category.hbm:true
* 代表的意思是:将关系维护的责任交给book
*
* 注意一点:
* hibernate通过管理持久态对象来操作数据库
*/
@Test
public void testAdd1() {
Book book = new Book();
book.setBookName(“圣墟”);
book.setPrice(66f);
Category category = new Category();
category.setCategoryId(7);
book.getCategories().add(this.categoryDao.get(category));
this.bookDao.save(book);
}
/**
* 这种添加方式是不可行的
* book.hbm:false
* category.hbm:true
* 代表的意思是:将关系(中间表)维护的责任交给book
*/
@Test
public void testAdd2() {
Category category = new Category();
category.setCategoryName("言情");
Book book = new Book();
book.setBookId(5);
category.getBooks().add(this.bookDao.get(book));
this.categoryDao.save(category);
}
/**
* book.hbm:true
* category.hbm:true
* 出现情况:中间表无对象维护
*/
@Test
public void testAdd3() {
Book book = new Book();
book.setBookName("圣墟2");
book.setPrice(66f);
Category category = new Category();
category.setCategoryId(7);
book.getCategories().add(this.categoryDao.get(category));
this.bookDao.save(book);
}
/**
* 讲解主控方book的删除
* 结论是一并将从表关联的中间表信息删除
*/
@Test
public void testDel1() {
Book book = new Book();
book.setBookId(5);
this.bookDao.del(book);
}
/**
* 讲解被控方处理中间表数据 删除
*/
@Test
public void testDel2() {
Category category = new Category();
category.setCategoryId(2);
this.categoryDao.del(category);
}
测试后的sql 语句:
Hibernate:
select
category0_.category_id as category1_2_0_,
category0_.category_name as category2_2_0_
from
t_hibernate_category category0_
where
category0_.category_id=?
Hibernate:
select
books0_.cid as cid1_1_0_,
books0_.bid as bid2_1_0_,
book1_.book_id as book_id1_0_1_,
book1_.book_name as book_nam2_0_1_,
book1_.price as price3_0_1_
from
t_hibernate_book_category books0_
inner join
t_hibernate_book book1_
on books0_.bid=book1_.book_id
where
books0_.cid=?
Hibernate:
delete
from
t_hibernate_category
where
category_id=?