hibernate之多对多

本文探讨了Hibernate框架中复杂且常见的多对多关系,解释了为何这可能导致一些开发者避开使用Hibernate。通过产品与供应商的案例,详细阐述了如何在实际场景中设置和操作多对多关系,并提供了相关的代码示例。

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

1.在hibernate中最为复杂的就是多对多的关系,可以把你绕晕,也是hibernate框架它之所以在公司中很少用到的原因之一。 

2.说说多对多的小思路,在这还是要以一个案例来说。例如:产品与供应商,一个产品不止一个供应商,一个供应商也不知一个产品,都是多对多的关系,那tiny就用这个案例给大家讲讲。

3.代码演示:

<1>

product产品类:

package com.tiny.entity;

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

public class Product {
	private int product_no;//编号
	private String product_name;//产品名称
	private int product_price;//产品价格
	
	private Category  category;//类别表
	
	Set<Supply> supply=new HashSet<Supply>();//供应商表
	
	
	public Set<Supply> getSupply() {
		return supply;
	}

	public void setSupply(Set<Supply> supply) {
		this.supply = supply;
	}

	public Category getCategory() {
		return category;
	}

	public void setCategory(Category category) {
		this.category = category;
	}

	public Product() {
		super();
	}
	

	public Product(String product_name, int product_price) {
		super();
		this.product_name = product_name;
		this.product_price = product_price;
	}

	public void setProduct_price(int product_price) {
		this.product_price = product_price;
	}

	public int getProduct_no() {
		return product_no;
	}
	public void setProduct_no(int product_no) {
		this.product_no = product_no;
	}
	public String getProduct_name() {
		return product_name;
	}
	public void setProduct_name(String product_name) {
		this.product_name = product_name;
	}

	public int getProduct_price() {
		return product_price;
	}
	
}

product映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate 

Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-23 18:09:26 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.tiny.entity.Product" table="PRODUCT">
        <id name="product_no" type="int">
            <column name="PRODUCT_NO" />
            <generator class="native" />
        </id>
        <property name="product_name" type="java.lang.String">
            <column name="PRODUCT_NAME" />
        </property>
        <property name="product_price" type="int">
            <column name="PRODUCT_PRICE" />
        </property>
        <many-to-one name="category" class="com.tiny.entity.Category" 

column="category_id"></many-to-one>
        

<!--多对多的关系-->
<set name="supply" table="p_s">
            <key>
                <column name="PRODUCT_NO" />
            </key>
            <many-to-many class="com.tiny.entity.Supply"  

column="supply_no"/>
        </set>
    </class>
</hibernate-mapping>

<2>

supply供应商的类:

package com.tiny.entity;

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

public class Supply {
	private int supply_no;//编号
	private String supply_name;//商品名称
	private String supply_descn;//商品的描述
	
	private Set<Product>product=new HashSet<Product>();// 商品的集合
	
	public Set<Product> getProduct() {
		return product;
	}
	public void setProduct(Set<Product> product) {
		this.product = product;
	}
	public int getSupply_no() {
		return supply_no;
	}
	public void setSupply_no(int supply_no) {
		this.supply_no = supply_no;
	}
	public String getSupply_name() {
		return supply_name;
	}
	public void setSupply_name(String supply_name) {
		this.supply_name = supply_name;
	}
	public String getSupply_descn() {
		return supply_descn;
	}
	public void setSupply_descn(String supply_descn) {
		this.supply_descn = supply_descn;
	}
	
	public Supply() {
		super();
	}
	public Supply(String supply_name, String supply_descn) {
		super();
		this.supply_name = supply_name;
		this.supply_descn = supply_descn;
	}
	
	
	
	

}


supply.hbm.xml映射:

<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate 

Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- Generated 2017-8-23 18:09:26 by Hibernate Tools 3.5.0.Final -->
<hibernate-mapping>
    <class name="com.tiny.entity.Supply" table="SUPPLY">
        <id name="supply_no" type="int">
            <column name="SUPPLY_NO" />
            <generator class="native" />
        </id>
        <property name="supply_name" type="java.lang.String">
            <column name="SUPPLY_NAME" />
        </property>
        <property name="supply_descn" type="java.lang.String">
            <column name="SUPPLY_DESCN" />
        </property>


<!--多对多的关系-->
        <set name="product" table="p_s" cascade="save-update">
            <key>
                <column name="SUPPLY_NO" />
            </key>
            <many-to-many class="com.tiny.entity.Product"  

column="product_no"/>
        </set>
    </class>
</hibernate-mapping>

test:测试演示:

package com.tiny.test;

import java.util.List;
import java.util.Set;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

import com.tiny.entity.Category;
import com.tiny.entity.Product;
import com.tiny.entity.Supply;

public class ManyManyTest {
	
	private Configuration configuration;
	private SessionFactory sessionFactory;
	private Session session;
	private Transaction transaction;

	@Before
	public void before(){
		configuration = new Configuration().configure();
		sessionFactory = configuration.buildSessionFactory();
		session = sessionFactory.openSession();
		transaction = session.beginTransaction();
	}
	
	@After
	public void after(){
		transaction.commit();
		session.close();
		sessionFactory.close();
	}

	
	@Test
	public void addProduct(){
		//一个的新商品:
		//名称为"Compaq 2620"
		//该商品属于"笔记本"类别1
		//由当前所有的提供商提供货源
//		Product product=new Product("Compaq 2620", 100);
//		Category cate=(Category) session.createQuery("from Category where category_name='笔记本'").uniqueResult();
//		cate.getProduct().add(product);
//		List<Supply> supply=session.createQuery("from Supply").list();
//		for (Supply supply2 : supply) {
//			supply2.getProduct().add(product);
//		}
	}
	
	@Test
	public void queryProductsBySupply(){
		//查询编号为" 1"的提供商提供的所有商品
//		 Supply supply=(Supply) session.createQuery("from Supply where supply_no=1").uniqueResult();
//		 Set<Product> pro=supply.getProduct();
//		 for (Product product : pro) {
//			System.out.println("1的提供商提供的所有商品:"+product.getProduct_name());
//		}
		
	}
	
	@Test
	public void addProductRel(){
		//添加名称为"测试"的类别
		//同时添加属于该类别的一个商品,商品编号为"P9001",名称为"测试商品"
		//并同时添加提供该新产品一个供应商,供应商的编号为"2",名称为"海尔"
//		Category cate=new Category("测试", "测试类商品");
//		session.save(cate);
//		Product product=new Product("测试商品", 100);
//		Category category=(Category) session.createQuery("from Category where category_name='测试'").uniqueResult();
//		category.getProduct().add(product);
//		Supply supply=(Supply) session.createQuery("from Supply where supply_no=2 and supply_name='海尔'").uniqueResult();
//		supply.getProduct().add(product);
		
	}
	
	@Test
	public void addSupplyRel(){
		//添加编号为"S9002",名称为"百脑汇"的供应商
		//并同时添加该供应商提供的一个商品,该商品编号为"P9002",名称为"kodako"
		//同时添加新商品所属的名称为"新型数码
//		Supply supply=new Supply("百脑汇", "百脑汇商家");
//		Product product=new Product("kodako",123);
//		supply.getProduct().add(product);
//		Category cate=new Category("新型数码", "新型数码的描述");
//		cate.getProduct().add(product);
//		
//		session.save(cate);
//		session.save(supply);
	}


}

好了,多对多的演示就到此结束啦




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值