hibernate 四 多对多的映射



       在电子商务中,多对多的关联关系也非常普遍,比如订单与商品,商品与购物车之间的关系都是属于多对多的关联关系,多对多的关联关系在关系数据库中不能直接实现,还必须依赖一张链接表用于保存这种关联关系。


一 , 多对多单向关联关系


订单表与商品表, 他们的链接表是selecteditems表


sql


CREATE TABLE `items` (
  `ID` int(4) NOT NULL auto_increment,
  `ITEMNO` varchar(20) default NULL,
  `ITEMNAME` varchar(60) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
CREATE TABLE `orders` (
  `ID` int(4) NOT NULL auto_increment,
  `ORDERNO` varchar(20) default NULL,
  `MONEY` decimal(10,2) default NULL,
  PRIMARY KEY  (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=gb2312;
CREATE TABLE `selecteditems` (
  `ORDERID` int(4) NOT NULL default '0',
  `ITEMID` int(4) NOT NULL default '0',
  PRIMARY KEY  (`ORDERID`,`ITEMID`)
)



持久化类

package com.xiu.many.to.many;


import java.io.Serializable;
import java.util.*;

public abstract class AbstractItems implements Serializable {
private int hashValue = 0;

private java.lang.Integer id;

private java.lang.String itemno;

private java.lang.String itemname;

private Set orders = new HashSet();

public AbstractItems() {
}

public AbstractItems(java.lang.Integer id) {
this.setId(id);
}

public java.lang.Integer getId() {
return id;
}

public void setId(java.lang.Integer id) {
this.hashValue = 0;
this.id = id;
}


public java.lang.String getItemno() {
return this.itemno;
}

public void setItemno(java.lang.String itemno) {
this.itemno = itemno;
}

public java.lang.String getItemname() {
return this.itemname;
}

public void setItemname(java.lang.String itemname) {
this.itemname = itemname;
}

public boolean equals(Object rhs) {
if (rhs == null)
return false;
if (!(rhs instanceof Items))
return false;
Items that = (Items) rhs;
if (this.getId() == null || that.getId() == null)
return false;
return (this.getId().equals(that.getId()));
}

public int hashCode() {
if (this.hashValue == 0) {
int result = 17;
int idValue = this.getId() == null ? 0 : this.getId().hashCode();
result = result * 37 + idValue;
this.hashValue = result;
}
return this.hashValue;
}

public Set getOrders() {
return orders;
}

public void setOrders(Set orders) {
this.orders = orders;
}
}



package com.xiu.many.to.many;


import java.io.Serializable;
import java.util.*;


public abstract class AbstractOrders implements Serializable {
private int hashValue = 0;


private java.lang.Integer id;


private java.lang.String orderno;


private java.lang.Double money;


private Set items = new HashSet();


public AbstractOrders() {
}


public AbstractOrders(java.lang.Integer id) {
this.setId(id);
}


public java.lang.Integer getId() {
return id;
}


public void setId(java.lang.Integer id) {
this.hashValue = 0;
this.id = id;
}


public java.lang.String getOrderno() {
return this.orderno;
}


public void setOrderno(java.lang.String orderno) {
this.orderno = orderno;
}


public java.lang.Double getMoney() {
return this.money;
}


public void setMoney(java.lang.Double money) {
this.money = money;
}


public boolean equals(Object rhs) {
if (rhs == null)
return false;
if (!(rhs instanceof Orders))
return false;
Orders that = (Orders) rhs;
if (this.getId() == null || that.getId() == null)
return false;
return (this.getId().equals(that.getId()));
}

public int hashCode() {
if (this.hashValue == 0) {
int result = 17;
int idValue = this.getId() == null ? 0 : this.getId().hashCode();
result = result * 37 + idValue;
this.hashValue = result;
}
return this.hashValue;
}

public Set getItems() {
return items;
}

public void setItems(Set items) {
this.items = items;
}
}



package com.xiu.many.to.many;
import java.io.Serializable;

public class Items extends AbstractItems implements Serializable {

public Items() {
}

public Items(java.lang.Integer id) {
super(id);
}


}




package com.xiu.many.to.many;

import java.io.Serializable;

public class Orders extends AbstractOrders implements Serializable {

public Orders() {
}

public Orders(java.lang.Integer id) {
super(id);
}

}



Items.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 package="com.xiu.many.to.many">
    <class name="Items" table="items">
        <id name="id" column="ID" type="integer">
            <generator class="identity"/>
        </id>
        <property name="itemno" column="ITEMNO" type="string" />
        <property name="itemname" column="ITEMNAME" type="string" />
        
        
        <!--映射Items到Orders的多对多单向关联-->
        <set name="orders" 
    table="selecteditems" 
    lazy="true" 
             inverse="true" 
             cascade="save-update">
        <key column="ITEMID"/>
        <many-to-many class="com.xiu.many.to.many.Orders" column="ORDERID"/>
        </set>         
    </class>
    
</hibernate-mapping>




Orders.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 package="com.xiu.many.to.many">
    <class name="Orders" table="orders">
        <id name="id" column="ID" type="integer">
            <generator class="identity"/>
        </id>
 
        <property name="orderno" column="ORDERNO" type="string" />
        <property name="money" column="MONEY" type="double" />
        
        <!--映射Orders到Items的多对多单向关联-->
        <set name="items" table="selecteditems" lazy="true" cascade="save-update">
        <key column="ORDERID"/>
        <many-to-many class="com.xiu.many.to.many.Items" column="ITEMID"/>
        </set>         
    </class>
    
</hibernate-mapping>


测试类

package com.xiu.many.to.many;
import java.util.HashSet;
import java.util.Set;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;

import com.xiu.hibernate.test.HibernateSessionFactory;

public class Test {
public static void main(String[] args) {
SessionFactory sessionFactory = HibernateSessionFactory
.getSessionFactory();
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
tx.begin();
Items item = new Items();
item.setItemname("商品1");
item.setItemno("001");


Items item2 = new Items();
item2.setItemname("商品2");
item2.setItemno("002");


Set<Items> items = new HashSet<Items>();
items.add(item);
items.add(item2);


Orders order = new Orders();
order.setOrderno("订单1");
order.setMoney(23.65);

Orders order2 = new Orders();
order2.setOrderno("订单2");
order2.setMoney(43.65);

Set<Orders> orderSet = new HashSet<Orders>();
orderSet.add(order);
orderSet.add(order2);
order.setItems(items);
order2.setItems(items);
item.setOrders(orderSet);
item2.setOrders(orderSet);
session.save(item);
session.save(item2);
session.save(order);
session.save(order2);
tx.commit();

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值