以商品和订单为例子
一、创建实体类商品和订单
二、让两个实体类互相表示
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);