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;
}
}
<?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);
}
}
好了,多对多的演示就到此结束啦