Hibernate关系映射---双向多对多增删查改实例

Hibernate关系映射---双向多对多增删查改实例

1、新建一个Java工程,添加hibernate3.3支持,连接test数据库

2、在src下新建com.etc.dao包,在包下新建Order.java类:

package com.etc.dao;

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

public class Order {
	private int no;
	private String owner;
	private Set<Product> products = new HashSet<Product>();//订单中有商品的set集合
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getOwner() {
		return owner;
	}
	public void setOwner(String owner) {
		this.owner = owner;
	}
	public Set<Product> getProducts() {
		return products;
	}
	public void setProducts(Set<Product> products) {
		this.products = products;
	}
	@Override
	public String toString() {
		return "Order [no=" + no + ", owner=" + owner + ", products="
				+ products + "]";
	}
	
}

3、在com.etc.dao下新建Product.java类:

package com.etc.dao;

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

public class Product {
	private int no;
	private String name;
	private Set<Order> orders = new HashSet<Order>();//商品中有订单的set集合
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Set<Order> getOrders() {
		return orders;
	}
	public void setOrders(Set<Order> orders) {
		this.orders = orders;
	}
	@Override
	public String toString() {
		return "Product [no=" + no + ", name=" + name + ", orders=" + orders
				+ "]";
	}
	
	
}

4、在com.etc.dao下新建Order.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.etc.dao.Order" table="t_order" catalog="test">
		<id name="no">
			<column name="order_no"/>
			<generator class="native"/>
		</id>
		<property name="owner">
			<column name="order_owner"/>
		</property>
		<!-- 在多端Product配置多端Product -->
		<set name="products" table="t_order_product" fetch="join" cascade="save-update">
			<key  column="order_no"></key>
			<many-to-many class="com.etc.dao.Product" column="product_no"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

5、在com.etc.dao下新建Product.hbm.xml映射文件:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
	<class name="com.etc.dao.Product" table="t_product" catalog="test">
		<id name="no">
			<column name="product_no"/>
			<generator class="native"/>
		</id>
		<property name="name">
			<column name="product_name"/>
		</property>
		<!-- 在多端Product中配置多端Order -->
		<set name="orders" table="t_order_product" cascade="save-update" fetch="join">
			<key  column="product_no"></key>
			<many-to-many class="com.etc.dao.Order" column="order_no"></many-to-many>
		</set>
	</class>
</hibernate-mapping>

6、修改hibernate.cfg.xml配置文件:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
          "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
          "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
    	<property name="show_sql">true</property>
    	<property name="format_sql">true</property>
    	<!-- <property name="hbm2ddl.auto">create</property> -->
    	<property name="current_session_context_class">thread</property>
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="connection.url">jdbc:mysql://localhost:3306/test</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="myeclipse.connection.profile">com.mysql.jdbc.Driver</property>
        <!-- 配置映射文件 -->
    	<mapping resource="com/etc/dao/Order.hbm.xml"/>
    	<mapping resource="com/etc/dao/Product.hbm.xml"/>
    </session-factory>

</hibernate-configuration>

7、在工程下新建test文件夹,在文件夹下新建com.etc.dao包,在包下新建ProductDAOTest.java测试类:

package com.etc.dao;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

public class ProductDAOTest {
	/**
	 * Description:新增:由多端Order来操作多端Product,在Order.hbm.xml中配置cascade=all,使得级联增加
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testCreate1(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		Order o1 = new Order();
		o1.setOwner("李白");
		
		Product p1 = new Product();
		p1.setName("梨");
		
		Product p2 = new Product();
		p2.setName("桃子");
		
		o1.getProducts().add(p1);
		o1.getProducts().add(p2);
		
		session.save(o1);
		session.getTransaction().commit();
	}
	/**
	 * Description:新增:由多端Product来操作多端Order,在Product.hbm.xml中配置cascade=all,使得级联增加
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testCreate2(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Product p1 = new Product();
		p1.setName("雪梨");
		
		Order o1 = new Order();
		o1.setOwner("李冰冰");
		
		Order o2 = new Order();
		o2.setOwner("范冰冰");
		
		p1.getOrders().add(o1);
		p1.getOrders().add(o2);
		
		session.save(p1);
		
		session.getTransaction().commit();
	}
	/**
	 * Description:修改:由多端Order操作多端Product
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testUpdate1(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Order o1 = (Order)session.get(Order.class,1);
		o1.setOwner("美女");
		
		for(Product p:o1.getProducts()){
			p.setName("香蕉");
		}
		
		session.getTransaction().commit();
	}
	/**
	 * Description:修改:由多端Product操作多端Order
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testUpdate2(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Product p1 = (Product)session.get(Product.class,1);
		p1.setName("芒果");
		
		for(Order o:p1.getOrders()){
			o.setOwner("李白");
		}
		
		session.getTransaction().commit();
	}
	/**
	 * Description:查询:由多端Order操作多端Product,在Order.hbm.xml中设置fetch=join属性,使得只发起一条sql,提高查询效率
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testRetrieve1(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Order o1 = (Order)session.get(Order.class,1);
		System.out.println(o1.getOwner());
		
		for(Product p:o1.getProducts()){
			System.out.println(p.getName());
		}
		
		session.getTransaction().commit();
	}
	/**
	 * Description:查询:由多端Product操作多端Order,在Order.hbm.xml中设置fetch=join属性,使得只发起一条sql,提高查询效率
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testRetrieve2(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Product p1 = (Product)session.get(Product.class,1);
		System.out.println(p1.getName());
		
		for(Order o:p1.getOrders()){
			System.out.println(o.getOwner());
		}
		
		session.getTransaction().commit();
	}
	/**
	 * Description:删除:删除指定的订单,设置了cascade=all之后,级联删除,该订单的所有商品也全部删除
	 * 所以不应该设置cascade=all属性,删除订单的时候,将两者之间的关系删除,但是商品不删除
	 * 只需要将cascade设置为save-update便可
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testDelete1(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Order o1 = (Order)session.get(Order.class,1);
		session.delete(o1);
		
		session.getTransaction().commit();
	}
	/**
	 * Description:删除:删除指定的商品,设置了cascade=all之后,级联删除,该商品的所有订单也全部删除
	 * 所以不应该设置cascade=all属性,删除商品的时候,删除商品和订单之间的关系,但是订单不删除
	 * 只需要将cascade设置为save-update便可
	 * @author zoey
	 * @date 2017年7月27日
	 */
	@Test
	public void testDelete2(){
		SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
		Session session = sessionFactory.getCurrentSession();
		session.beginTransaction();
		
		Product p1 = (Product)session.get(Product.class,1);
		session.delete(p1);
		
		session.getTransaction().commit();
	}
}

总结:

1、双向多对多关系:任意一方的多端都可以操作另外一方的多端,所以,在测试类中的所有增删查改操作中,都有两种选择。

2、要注意配置cascade属性和fetch属性。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值