Hibernate多对多(02)

本文详细介绍了Hibernate中多对多关系的级联新增和删除操作。在级联新增中,讨论了inverse属性的三种形式及其对级联关系的影响,以及级联删除时如何避免错误。在级联删除部分,分别阐述了主控方和被控方删除的实现策略,强调了在关联关系维护中应注意的事项。

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

一:级联新增

列子:书本表book  和category

在多对多的关系维护中,hibernate管理的是持久太的对象

inverse的三种形式

book.hbm.xml: inverse="false"

category.hbm.xml:inverser="true"

<set table="t_hibernate_book_category" name="categories" cascade="save-update" inverse="false">

inverse 反方的,inverser 影响的是set中的 cascade

cascade的三种形式:① cascade="save-update"  ②cascade="delete"  ③ cascade="all"(通常为第一种)

指的是将级联关系的维护的责任交给book对象 

 

book.hbm.xml: inverse="false"

category.hbm.xml:inverser="false"

中间表会有两条重复的数据

 

book.hbm.xml: inverse="true"

category.hbm.xml:inverser="true"

两个都不维护中间表  所以中间表没有数据

 

级联新增报错: 原因:在多对多的关系维护中,hibernate管理的是持久太的对象,而testadd中开始获取的对象是临时态

package com.zking.five.dao;

import static org.junit.Assert.*;

import org.junit.Test;

import com.zking.five.entity.Book;
import com.zking.five.entity.Category;

public class BookDaoTest {
	private BookDao bookDao=new BookDao();
	private CategoryDao categoryDao=new CategoryDao();
	
	
	/**
	 * -----------------six
	 * 级联新增
	 * book.hbm.xml:inverse=false;
	 * category.xml: inverse="true"
	 * 
	 * 如果都为false 中间表会加入两条书数据
	 * 如果都为true
	 * 
	 * inverse  反方
	 * 指的是将级联关系的维护责任交个book对象。
	 * 
	 * jdbc:
	 *   this.bookDao.add
	 *   this.bookCategoryDao.add
	 *   
	 *   
	 *  hibernate
	 *   this.bookDao.add即可
	 *   
	 *   在多对多的关系维护中 hibernate管理的是持久太对象
	 */
	
	@Test
	public void testAdd() {
		Book book=new Book();
		
		book.setBookName("双世宠妃");
		book.setPrice(45f);
		//绑定类别  new 出来的是临时状态
		Category category=new Category();
		category.setCategoryId(4);
		//会报错

		book.getCategories().add(category);

		//获取的是持久化的
		//book.getCategories().add(this.categoryDao.get(category));
		this.bookDao.add(book);
		
				
	}
	
	

}

 

二:级联删除

禁用级联删除

①主控方删除

         需求:删除有关联关系的一个类别,包括该类别下的所有书籍

②被控方删除

      步骤:a:被控方通过主控方来解除关联关系

                b:再去删除被控方

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

demo 1 主控方的删除

package com.zking.five.dao;

import java.io.Serializable;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zking.five.entity.Book;
import com.zking.two.util.SessionFactoryUtil;

public class BookDao {
	

	
	public Integer add(Book book) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Integer bid =(Integer) session.save(book);
		transaction.commit();
		session.close();
		return bid;
	}
	
	/**
	 * 主控方的删除
	 * @param book
	 */
	public void del(Book book) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		session.delete(book);
		transaction.commit();
		session.close();
	}
	

}

 

demo2被控方的删除

package com.zking.five.dao;

import org.hibernate.Hibernate;
import org.hibernate.Session;
import org.hibernate.Transaction;

import com.zking.five.entity.Book;
import com.zking.five.entity.Category;
import com.zking.two.util.SessionFactoryUtil;

public class CategoryDao {

	
	public Integer add(Category category) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Integer cid =(Integer) session.save(category);
		transaction.commit();
		session.close();
		return cid;
	}
	
    /**
     *被控方的删除
    /
	public void del(Category category) {
		Session session = SessionFactoryUtil.getSession();
		Transaction transaction = session.beginTransaction();
		Category c = session.get(Category.class, category.getCategoryId());
		for (Book b : c.getBooks()) {
			//c.getBooks().remove(b);
			//主控方进行移除
			b.getCategories().remove(c);
		}
		session.delete(c);
		transaction.commit();
		session.close();
	}
	
}

 

测试类执行的结果

package com.zking.five.dao;

import static org.junit.Assert.*;

import org.junit.Test;

import com.zking.five.entity.Book;
import com.zking.five.entity.Category;

public class BookDaoTest {
	private BookDao bookDao=new BookDao();
	private CategoryDao categoryDao=new CategoryDao();
	

	

	/**
	 *级联删除
	 *  主控方删除
	 *  需求:删除有关联关系的一方
	 *   删除浮生物语。目前这本书在中间表引用
	 *   
	 *   jdbc:
	 *   this.bookDao.del
	 *   this.bookCategoryDao.del
	 * 
	 */
	
	@Test
	//可以删掉
	public void testdel() {
		Book book=new Book();
		book.setBookId(5);
		this.bookDao.del(book);
		
	}
	
	/**
	 *级联删除
	 *  被控方删除
	 *  需求:删除有关联关系的一个类别,包括该类别下的所有书籍
	 *   
	 *   删除:玄幻这个类别,目前这本书在中间表引用
	 *   
	 *   
	 *   
	 *   删除的步骤:
	 *   ①:被控方通过主控方来解除关联关系
	 *   ②:再去删除被控方
	 *   
	 *   
	 * 
	 */
	@Test
	public void testdel2() {
		Category category=new Category();
		category.setCategoryId(4);
		this.categoryDao.del(category);
		
	}
	

}

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值