Hibernate的多对多操作

以商品和订单为例子

一、创建实体类商品和订单

二、让两个实体类互相表示

1>一个订单可以有多个商品,用set集合

private Set<GoodsOrder> goodsOrderSet = new HashSet<GoodsOrder>();

2>一个商品可以属于多个订单,用set集合

private Set<Goods> goodsSet = new HashSet<Goods>();

三、配置映射关系

1>goods商品配置

 <hibernate-mapping>
    <class name="com.zhy.hibernate0207.model.Goods" table="goods">
    <id name="gId" column="gId">
    <!-- 
   	native:生成表的id值就是主键自动增长
     -->
    <generator class="native"></generator>
    </id>
  <property name="gName" column="gName"></property>  
    <property name="gPrice" column="gPrice"></property>  
    <!-- table值设置第三张表的名字  goods_order -->
    <set name="goodsOrderSet"  table="goods_order" cascade="save-update">
    <!-- Key标签用来设置googs在第三张表里的Id -->
    <key column="gId"></key>
    <!-- 下面标签填写订单信息,class 为订单的全路径  column 为订单 在第三张表里显示的Id-->
    <many-to-many class="com.zhy.hibernate0207.model.GoodsOrder" column="goId"></many-to-many>
    </set>
      </class>
    </hibernate-mapping>


2>goodsOrder订单配置

    <hibernate-mapping>
    <class name="com.zhy.hibernate0207.model.GoodsOrder" table="goodsOrder">
    <id name="goId" column="goId">
    <!-- 
   	native:生成表的id值就是主键自动增长
     -->
    <generator class="native"></generator>
    </id>
    <property name="goTime" column="goTime"></property>  
    <!-- table值设置第三张表的名字  goods_order -->
    <set name="goodsSet"  table="goods_order" cascade="save-update">
    <!-- key表示订单的在第三张表里显示的Id -->
    <key column="goId"></key>
    <!-- 下面标签写商品信息,class 为商品的全路径 ,column为商品在第三张表显示的id-->
     <many-to-many class="com.zhy.hibernate0207.model.Goods" column="gId"></many-to-many>
    </set>
      </class>
    </hibernate-mapping>

四、多对多级联保存

1>将set标签的cascade的值设置为  save-update

<set name="goodsSet"  table="goods_order" cascade="save-update">

2>级联保存,

创建用户和对象,把角色放进用户里面去,最终保存用户就行

public class ManyToManyTest {
	@Test
	public void testAdd(){
		SessionFactory factory = null;
		Session session = null;
		Transaction tr = null;
		try{
			factory = HibernateDbutils.getSessionFactory();
			session = factory.openSession();
			tr = session.beginTransaction();
		
			Goods g1 = new  Goods();
			g1.setgName("冰红茶");
			g1.setgPrice(3.00);
			
			Goods g2 = new Goods();
			g2.setgName("红牛");
			g2.setgPrice(6.00);
			
			Goods g3 = new Goods();
			g3.setgName("开心果");
			g3.setgPrice(13.00);
			
			GoodsOrder go1 = new GoodsOrder();
			go1.setGoTime("2018-02-21");
			
			GoodsOrder go2 = new GoodsOrder();
			go2.setGoTime("2018-01-08");
			
			GoodsOrder go3 = new GoodsOrder();
			go3.setGoTime("2018-04-30");
			
			go1.getGoodsSet().add(g1);
			go1.getGoodsSet().add(g2);
			
			go2.getGoodsSet().add(g3);
			go2.getGoodsSet().add(g1);
			
			go3.getGoodsSet().add(g2);
			
			session.save(go3);
			session.save(go2);
			session.save(go1);
			
			tr.commit();
		}catch(Exception e){
			e.printStackTrace();
			tr.rollback();
		}finally{
			session.close();
			factory.close();
		}
	}
}

五、多对多级联删除

1>将set标签的cascade的值设置为  save-update

<set name="goodsSet"  table="goods_order" cascade="save-update">
2>将订单查找出来,然后删除订单,就可以将goods_order表中的所用关于该订单的信息删除
	GoodsOrder go = session.get(GoodsOrder.class, 6);
			session.delete(go);

六、维护第三张表来维护两个表的关系

维护关系订单和商品的关系用过第三张表进行维护

1>在订单里加入某个商品

//查询出来Id=5的商品和Id=6的订单,将商品加入订单
			Goods goods = session.get(Goods.class, 5);
			GoodsOrder go = session.get(GoodsOrder.class, 6);
			go.getGoodsSet().add(goods);

2>将某个订单里的商品删除

//查询出来Id=5的商品和Id=6的订单,将商品删除
			Goods goods = session.get(Goods.class, 5);
			GoodsOrder go = session.get(GoodsOrder.class, 6);
			go.getGoodsSet().remove(goods);




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值