Hibernate 多对多关系

1数据库中的多对多关系:
1-1: 数据库中不能直接映射多对多

处理:创建一个桥接表(中间表),将一个多对多关系转换成两个一对多

注1:数据库多表联接查询
       永远就是二个表的联接查询
注2:交叉连接
注3:外连接:left(左)/right(右)/full(左右)
       主从表:连接条件不成立时,主表记录永远保留,与null匹配
2. hibernate的多对多
2.1 hibernate可以直接映射多对多关联关系(看作两个一对多)
3、实例:
3-1:创建一个Book实体类:
package com.zking.five.entity;

import java.util.HashSet;
import java.util.Set;

public class Book {
	private Integer bookId;
	private String bookName;
	private Float price;
	
	
	private Set<Category> categories = new HashSet<Category>();
//	强制初始化
	public Integer initCategories = 0 ;
	
	public Integer getInitCategories() {
		return initCategories;
	}
	public void setInitCategories(Integer initCategories) {
		this.initCategories = initCategories;
	}
	public Set<Category> getCategories() {
		return categories;
	}
	public void setCategories(Set<Category> categories) {
		this.categories = categories;
	}
	public Integer getBookId() {
		return bookId;
	}
	public void setBookId(Integer bookId) {
		this.bookId = bookId;
	}
	public String getBookName() {
		return bookName;
	}
	public void setBookName(String bookName) {
		this.bookName = bookName;
	}
	public Float getPrice() {
		return price;
	}
	public void setPrice(Float price) {
		this.price = price;
	}
	
	

}

xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
 <hibernate-mapping>
    <class table="t_hibernate_book" name="com.zking.five.entity.Book">
    
    	<id name="bookId" type="java.lang.Integer" column="book_id">
    		<generator class="increment"></generator>
    	</id>
    	<property name="bookName" type="java.lang.String" column="book_name"></property>
    	
    	<property name="price" type="java.lang.Float" column="price"></property>
    	
    	<set table="t_hibernate_book_category" name="categories" cascade="save-update" inverse="false">
    	<!-- one 的关系 -->
    		<key column="bid"></key>
    		<many-to-many column="cid" class="com.zking.five.entity.Category"></many-to-many>
    	</set>
    </class>	
   
  	
 </hibernate-mapping>
3-2:创建一个类别实体类:category
package com.zking.five.entity;

import java.util.HashSet;
import java.util.Set;

public class Category {
	private Integer categoryId;
	private String categoryName;
	
	private Set<Book> books = new HashSet<Book>();
	private Integer initBooks = 0 ;
	
	
	public Integer getInitBooks() {
		return initBooks;
	}
	public void setInitBooks(Integer initBooks) {
		this.initBooks = initBooks;
	}
	public Integer getCategoryId() {
		return categoryId;
	}
	public void setCategoryId(Integer categoryId) {
		this.categoryId = categoryId;
	}
	public String getCategoryName() {
		return categoryName;
	}
	public void setCategoryName(String categoryName) {
		this.categoryName = categoryName;
	}
	public Set<Book> getBooks() {
		return books;
	}
	public void setBooks(Set<Book> books) {
		this.books = books;
	}
	
	

}

xml配置:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
    "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
    
 <hibernate-mapping>
    <class table="t_hibernate_category" name="com.zking.five.entity.Category">
    
    	<id name="categoryId" type="java.lang.Integer" column="category_id">
    		<generator class="increment"></generator>
    	</id>
    	<property name="categoryName" type="java.lang.String" column="category_name"></property>
    	
	<set table="t_hibernate_book_category" name="books" cascade="save-update" inverse="true">
		<key column="cid"></key>
		<many-to-many column="bid" class="com.zking.five.entity.Book"></many-to-many>
	</set>    	
    	
    </class>	
   
  	
 </hibernate-mapping>
3-3:增加:
	public Integer add(Book book) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		Integer bid = (Integer)session.save(book);
		transaction.commit();
		session.close();
		return bid;
	}
	
	@Test
	public void testAdd1() {
		Book book = new Book();
		book.setBookName("不温不火");
		book.setPrice(23f);
		Category category = new Category();
		category.setCategoryId(5);
		book.getCategories().add(this.CategoryDao.get(category));
		this.bookDao.add(book);
	}
	
	
3-4:删除:
/**
	 * 删除
	 * @param book
	 */
	public void del(Book book) {
		Session session = SessionFactoryUtils.getSession();
		Transaction transaction = session.beginTransaction();
		session.delete(book);
		transaction.commit();
		session.close();
		
	}
/**
	 * 主控方删除
	 * 需求:删除有关联的一本书
	 * 删除,不温不火的这本书,
	 * 同时删除中间表
	 */
	@Test
	public void testDel() {
		Book book = new Book();
		book.setBookId(5);
		this.bookDao.del(book);
	}

	/**
	 * 删除
	 * 1、被控方通过主控方来解除关联的关系
	 * 2、再去删除被控方
	 * @param book
	 */
	public void del(Category category) {
		Session session = SessionFactoryUtils.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();
	}

/**
	 * 被控方删除
	 * 需求:删除有关联关系的一个类别,包括该类别下的所有书籍
	 * 结果:无法删除
	 * Cannot delete or update a parent row: a foreign key constraint fails (`test`.`t_hibernate_book_category`, CONSTRAINT `t_hibernate_book_category_ibfk_2` FOREIGN KEY (`cid`) REFERENCES `t_hibernate_category` (`category_id`))
	 */
	@Test
	public void testDel2() {
		Category category = new Category();
		category.setCategoryId(5);
		this.CategoryDao.del(category);
	}
	
4、多对多的注意事项:
4-1:一定要定义一个主控方
4-2: 多对多删除
4-2-1:主控方直接删除
4-2-2:被控方先通过主控方解除多对多关系,再删除被控方
4-2-3:禁用级联删除
4-3:关联关系编辑,不需要直接操作桥接表,hibernate的主控方会自动维护
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值