在电子商务中,多对多的关联关系也非常普遍,比如订单与商品,商品与购物车之间的关系都是属于多对多的关联关系,多对多的关联关系在关系数据库中不能直接实现,还必须依赖一张链接表用于保存这种关联关系。
一 , 多对多单向关联关系
订单表与商品表, 他们的链接表是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();
}
}