1. 程式人生 > 實用技巧 >4.3.8 對映多對多單向關聯關係

4.3.8 對映多對多單向關聯關係

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

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:


  1. packagecom.ORM;
  2. importjava.io.Serializable;
  3. importjava.util.*;
  4. publicclassOrdersimplementsSerializable{
  5. privatejava.lang.Integerid;//ID號
  6. privatejava.lang.Stringorderno;//訂單編號
  7. privatejava.lang.Doublemoney;//訂單金額
  8. privateSetitems=newHashSet();//商品集合
  9. publicOrders(){}
  10. //省略上述各屬性的get/set方法對
  11. }

持久化類Items.java:



  1. packagecom.ORM;
  2. importjava.io.Serializable;
  3. publicclassItemsimplementsSerializable{
  4. privatejava.lang.Integerid;//ID號
  5. privatejava.lang.Stringitemno;//商品編號
  6. privatejava.lang.Stringitemname;//商品名稱
  7. publicItems(){}
  8. //省略上述各屬性的get/set方法對
  9. }

items表與Items 類的ORM對映檔案Items.hbm.xml:


  1. <?xmlversion="1.0"encoding='UTF-8'?>
  2. <!DOCTYPEhibernate-mappingPUBLIC
  3. "-//Hibernate/HibernateMappingDTD3.0//EN"
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  5. <hibernate-mappingpackage="com.ORM">
  6. <classname="Items"table="items">
  7. <idname="id"column="ID"type="integer">
  8. <generatorclass="identity"/>
  9. </id>
  10. <propertyname="itemno"column="ITEMNO"type="string"/>
  11. <propertyname="itemname"column="ITEMNAME"type="string"/>
  12. </class>
  13. </hibernate-mapping>

orders表與Orders類的 ORM對映檔案Orders.hbm.xml:

(1)建立供測試用的TestBean.java。


  1. ……
  2. //新增一個商品
  3. publicvoidaddItem(Stringitemno,Stringitemname){
  4. Itemsitem=newItems();
  5. item.setItemno(itemno);
  6. item.setItemname(itemname);
  7. dao.addItems(item);
  8. }
  9. //新增一個訂單
  10. publicvoidaddOrder(Stringorderno,Doublemoney,Setitems){
  11. Ordersorder=newOrders();
  12. order.setOrderno(orderno);
  13. order.setMoney(money);
  14. order.setItems(items);//設定Orders到Items的多對多單向關聯
  15. dao.addOrders(order);
  16. }
  17. //裝載一個商品
  18. publicItemsloadItems(Integerid){
  19. returndao.loadItems(id);
  20. }
  21. //裝載一個訂單
  22. publicOrdersloadOrders(Integerid){
  23. returndao.loadOrders(id);
  24. }
  25. ……

(2)建立測試JSP頁面index.jsp。


  1. <%@pagelanguage="java"pageEncoding="gb2312"%>
  2. <%@pageimport="com.bean.TestBean"%>
  3. <%@pageimport="com.ORM.*"%>
  4. <%@pageimport="java.util.*"%>
  5. <jsp:useBeanid="test"class="com.bean.TestBean"/>
  6. <html>
  7. <head><title>Hibernate的多對多單向關聯關係對映</title></head>
  8. <body>
  9. <h2>Hibernate的多對多單向關聯關係對映</h2><hr>
  10. <%
  11. //新增3個商品
  12. test.addItem("001","A商品");
  13. test.addItem("002","B商品");
  14. test.addItem("003","C商品");
  15. //選購其中的兩個商品
  16. Setitems=newHashSet();
  17. items.add(test.loadItems(newInteger(2)));
  18. items.add(test.loadItems(newInteger(3)));
  19. //將選購的商品產生一張訂單
  20. test.addOrder("A00001",newDouble(2100.5),items);
  21. //裝載訂單
  22. Ordersorder=test.loadOrders(newInteger(1));
  23. out.println("<br>訂單""+order.getOrderno().trim()+""中的商品清單為:");
  24. Iteratorit=order.getItems().iterator();
  25. Itemsitem=null;
  26. while(it.hasNext()){
  27. item=(Items)it.next();
  28. out.println("<br>商品編號:"+item.getItemno().trim());
  29. out.println("<br>商品名稱:"+item.getItemname().trim());
  30. }
  31. %>
  32. </body>
  33. </html>

index.jsp執行分析。

(1)執行了"新增3個商品"以後,Hibernate向資料庫伺服器提交的SQL語句為:


  1. 【SQL】insertintoitems(ITEMNO,ITEMNAME)values("001","A商品")
  2. insertintoitems(ITEMNO,ITEMNAME)values("002","B商品")
  3. insertintoitems(ITEMNO,ITEMNAME)values("003","C商品")

(2)執行了"選購其中的兩個商品"以後,Hibernate向資料庫伺服器提交的SQL語句為:


  1. 【SQL】select*fromitemswhereID=2
  2. select*fromitemswhereID=3

(3)執行了"將選購的商品產生一張訂單"以後,Hibernate向資料庫伺服器提交的SQL語句為:


  1. 【SQL】insertintoorders(ORDERNO,MONEY)values("A00001",2100.5)
  2. insertintoselecteditems(ORDERID,ITEMID)values(1,2)
  3. insertintoselecteditems(ORDERID,ITEMID)values(1,3)

(4)執行了"裝載訂單"以後,Hibernate向資料庫伺服器提交的SQL語句為:


  1. 【SQL】select*fromorderswhereID=1
  2. selecta.*,b.*fromselecteditemsainnerjoinitemsbona.ITEMID=b.ID
  3. wherea.ORDERID=1

index.jsp執行效果如圖4-26所示。

本例項的完整原始碼請參考配套光碟的"原始碼"部分。

轉載於:https://my.oschina.net/airship/blog/821072