多对多的增加跟删除

本文探讨了在数据库操作中,如何处理主表与中间表之间的关联关系,特别是在删除操作时遇到的问题。通过实例演示了如何正确地删除主表记录而不违反外键约束,以及在不同情况下(如inverse属性设置)如何维护中间表的数据一致性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

/**
* 被控方删除失败的原因?
* 因为被控方被中间表所引用
*
* 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=?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值