4.3.8 對映多對多單向關聯關係
阿新 • • 發佈:2020-10-22
4.3.8 對映多對多單向關聯關係
在電子商務應用中,多對多的關聯關係也非常普遍,諸如訂單與商品、商品與購物車之間的關係均屬於多對多的關聯關係。多對多關聯在關係資料庫中不能直接實現,還必須依賴一張連線表用於儲存這種關聯關係。
下面以訂單表(見表4-17)與商品表(見表4-18)為例來說明多對多單向關聯關係的對映,訂單表與商品表的連線表為selecteditems(見表4-19)。
表4-17 訂單表orders
表4-18 商品表items
表4-19 連線表selecteditems
訂單表與商品表之間的多對多單向關聯通過連線表來實現,如圖4-24所示。
持久化類訂單到商品之間的多對多單向關聯關係如圖4-25所示。
持久化類Orders.java:
- packagecom.ORM;
- importjava.io.Serializable;
- importjava.util.*;
- publicclassOrdersimplementsSerializable{
- privatejava.lang.Integerid;//ID號
- privatejava.lang.Stringorderno;//訂單編號
- privatejava.lang.Doublemoney;//訂單金額
- privateSetitems=newHashSet();//商品集合
- publicOrders(){}
- //省略上述各屬性的get/set方法對
- }
持久化類Items.java:
- packagecom.ORM;
- importjava.io.Serializable;
- publicclassItemsimplementsSerializable{
- privatejava.lang.Integerid;//ID號
- privatejava.lang.Stringitemno;//商品編號
- privatejava.lang.Stringitemname;//商品名稱
- publicItems(){}
- //省略上述各屬性的get/set方法對
- }
items表與Items 類的ORM對映檔案Items.hbm.xml:
- <?xmlversion="1.0"encoding='UTF-8'?>
- <!DOCTYPEhibernate-mappingPUBLIC
- "-//Hibernate/HibernateMappingDTD3.0//EN"
- "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
- <hibernate-mappingpackage="com.ORM">
- <classname="Items"table="items">
- <idname="id"column="ID"type="integer">
- <generatorclass="identity"/>
- </id>
- <propertyname="itemno"column="ITEMNO"type="string"/>
- <propertyname="itemname"column="ITEMNAME"type="string"/>
- </class>
- </hibernate-mapping>
orders表與Orders類的 ORM對映檔案Orders.hbm.xml:
(1)建立供測試用的TestBean.java。
- ……
- //新增一個商品
- publicvoidaddItem(Stringitemno,Stringitemname){
- Itemsitem=newItems();
- item.setItemno(itemno);
- item.setItemname(itemname);
- dao.addItems(item);
- }
- //新增一個訂單
- publicvoidaddOrder(Stringorderno,Doublemoney,Setitems){
- Ordersorder=newOrders();
- order.setOrderno(orderno);
- order.setMoney(money);
- order.setItems(items);//設定Orders到Items的多對多單向關聯
- dao.addOrders(order);
- }
- //裝載一個商品
- publicItemsloadItems(Integerid){
- returndao.loadItems(id);
- }
- //裝載一個訂單
- publicOrdersloadOrders(Integerid){
- returndao.loadOrders(id);
- }
- ……
(2)建立測試JSP頁面index.jsp。
- <%@pagelanguage="java"pageEncoding="gb2312"%>
- <%@pageimport="com.bean.TestBean"%>
- <%@pageimport="com.ORM.*"%>
- <%@pageimport="java.util.*"%>
- <jsp:useBeanid="test"class="com.bean.TestBean"/>
- <html>
- <head><title>Hibernate的多對多單向關聯關係對映</title></head>
- <body>
- <h2>Hibernate的多對多單向關聯關係對映</h2><hr>
- <%
- //新增3個商品
- test.addItem("001","A商品");
- test.addItem("002","B商品");
- test.addItem("003","C商品");
- //選購其中的兩個商品
- Setitems=newHashSet();
- items.add(test.loadItems(newInteger(2)));
- items.add(test.loadItems(newInteger(3)));
- //將選購的商品產生一張訂單
- test.addOrder("A00001",newDouble(2100.5),items);
- //裝載訂單
- Ordersorder=test.loadOrders(newInteger(1));
- out.println("<br>訂單""+order.getOrderno().trim()+""中的商品清單為:");
- Iteratorit=order.getItems().iterator();
- Itemsitem=null;
- while(it.hasNext()){
- item=(Items)it.next();
- out.println("<br>商品編號:"+item.getItemno().trim());
- out.println("<br>商品名稱:"+item.getItemname().trim());
- }
- %>
- </body>
- </html>
index.jsp執行分析。
(1)執行了"新增3個商品"以後,Hibernate向資料庫伺服器提交的SQL語句為:
- 【SQL】insertintoitems(ITEMNO,ITEMNAME)values("001","A商品")
- insertintoitems(ITEMNO,ITEMNAME)values("002","B商品")
- insertintoitems(ITEMNO,ITEMNAME)values("003","C商品")
(2)執行了"選購其中的兩個商品"以後,Hibernate向資料庫伺服器提交的SQL語句為:
- 【SQL】select*fromitemswhereID=2
- select*fromitemswhereID=3
(3)執行了"將選購的商品產生一張訂單"以後,Hibernate向資料庫伺服器提交的SQL語句為:
- 【SQL】insertintoorders(ORDERNO,MONEY)values("A00001",2100.5)
- insertintoselecteditems(ORDERID,ITEMID)values(1,2)
- insertintoselecteditems(ORDERID,ITEMID)values(1,3)
(4)執行了"裝載訂單"以後,Hibernate向資料庫伺服器提交的SQL語句為:
- 【SQL】select*fromorderswhereID=1
- selecta.*,b.*fromselecteditemsainnerjoinitemsbona.ITEMID=b.ID
- wherea.ORDERID=1
index.jsp執行效果如圖4-26所示。
本例項的完整原始碼請參考配套光碟的"原始碼"部分。
轉載於:https://my.oschina.net/airship/blog/821072