博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
4.3.8 映射多对多单向关联关系
阅读量:7000 次
发布时间:2019-06-27

本文共 3830 字,大约阅读时间需要 12 分钟。

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. package com.ORM;  
  2. import java.io.Serializable;  
  3. import java.util.*;  
  4. public class Orders implements Serializable{  
  5.     private java.lang.Integer id;               //ID号  
  6.     private java.lang.String orderno;               //订单编号  
  7.     private java.lang.Double money;                 //订单金额  
  8.     private Set items = new HashSet();          //商品集合   
  9.     public Orders(){}  
  10.     //省略上述各属性的get/set方法对  

持久化类Items.java:

 

 

 
  1. package com.ORM;  
  2. import java.io.Serializable;  
  3. public class Items implements Serializable{  
  4.     private java.lang.Integer id;               //ID号  
  5.     private java.lang.String itemno;                //商品编号  
  6.     private java.lang.String itemname;              //商品名称  
  7.     public Items(){}  
  8.     //省略上述各属性的get/set方法对  

items表与Items 类的ORM映射文件Items.hbm.xml:

 
  1. <?xml version="1.0" encoding='UTF-8'?>  
  2. <!DOCTYPE hibernate-mapping PUBLIC  
  3. "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
  4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd" >  
  5. <hibernate-mapping package="com.ORM">  
  6.     <class name="Items" table="items">  
  7.         <id name="id" column="ID" type="integer">  
  8.             <generator class="identity"/>  
  9.         </id>   
  10.         <property name="itemno" column="ITEMNO" type="string" />  
  11.         <property name="itemname" column="ITEMNAME" type="string" />  
  12.     </class>      
  13. </hibernate-mapping> 

orders表与Orders类的 ORM映射文件Orders.hbm.xml:

 
 

(1)创建供测试用的TestBean.java。

 
  1. ……  
  2.     //新增一个商品  
  3.     public void addItem(String itemno,String itemname){  
  4. Items item = new Items();  
  5. item.setItemno(itemno);  
  6. item.setItemname(itemname);  
  7. dao.addItems(item);  
  8.     }     
  9.     //新增一个订单  
  10.     public void addOrder(String orderno,Double money,Set items){  
  11. Orders order = new Orders();  
  12. order.setOrderno(orderno);  
  13. order.setMoney(money);  
  14. order.setItems(items);  //设置Orders到Items的多对多单向关联  
  15. dao.addOrders(order);  
  16.     }     
  17.     //装载一个商品  
  18.     public Items loadItems(Integer id){  
  19. return dao.loadItems(id);  
  20.     }     
  21.     //装载一个订单  
  22.     public Orders loadOrders(Integer id){  
  23. return dao.loadOrders(id);  
  24.     }  
  25. …… 

(2)创建测试JSP页面index.jsp。

 
  1. <%@ page language="java" pageEncoding="gb2312"%>  
  2. <%@ page import="com.bean.TestBean"%>  
  3. <%@ page import="com.ORM.*"%>  
  4. <%@ page import="java.util.*"%>  
  5. <jsp:useBean id="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. Set items = new HashSet();  
  17. items.add(test.loadItems(new Integer(2)));  
  18. items.add(test.loadItems(new Integer(3)));  
  19. //将选购的商品产生一张订单  
  20. test.addOrder("A00001",new Double(2100.5),items);  
  21. //装载订单  
  22. Orders order = test.loadOrders(new Integer(1));  
  23. out.println("<br>订单""+order.getOrderno().trim()+""中的商品清单为:");  
  24. Iterator it = order.getItems().iterator();  
  25. Items item = 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】insert into items(ITEMNO,ITEMNAME) values("001","A商品")  
  2. insert into items(ITEMNO,ITEMNAME) values("002","B商品")  
  3. insert into items(ITEMNO,ITEMNAME) values("003","C商品") 

(2)执行了"选购其中的两个商品"以后,Hibernate向数据库服务器提交的SQL语句为:

 
  1. 【SQL】select * from items where ID=2 
  2. select * from items where ID=3 

(3)执行了"将选购的商品产生一张订单"以后,Hibernate向数据库服务器提交的SQL语句为:

 
  1. 【SQL】insert into orders(ORDERNO,MONEY) values("A00001",2100.5)  
  2. insert into selecteditems(ORDERID,ITEMID) values (1,2)  
  3. insert into selecteditems(ORDERID,ITEMID) values (1,3) 

(4)执行了"装载订单"以后,Hibernate向数据库服务器提交的SQL语句为:

 
  1. 【SQL】select * from orders where ID=1 
  2. select a.*,b.* from selecteditems a inner join items b on a.ITEMID=b.ID   
  3. where a.ORDERID=1 

index.jsp运行效果如图4-26所示。

 

  

 

本实例的完整源代码请参考配套光盘的"源代码"部分。

转载于:https://my.oschina.net/airship/blog/821072

你可能感兴趣的文章
关于5G被激烈讨论的那些争端和冲突
查看>>
Jenkins部署码云SpringBoot项目
查看>>
抛弃NVelocity,来玩玩Razor
查看>>
在JavaScript面向对象编程中使用继承(1)
查看>>
高铁与机场成交通信息化建设的双驾马车
查看>>
chmod命令
查看>>
货币的起源和职能是什么?绘制货币资金管理思维导图简单的方法介绍
查看>>
springboot+kafka+elk+docker+docker-compose+centos搭建日志收集系统
查看>>
时讯无线如何满足商业区的无线覆盖?
查看>>
2014最新open***搭建实例
查看>>
WinAPI: midiOutCachePatches - 预装音色
查看>>
finally执行顺序
查看>>
TWebBrowser 与 MSHTML(2): 获取 window 对象的时机
查看>>
【博客话题】IT人,你肿么了? ——除了IT,你还能选择什么?
查看>>
docker初步入门
查看>>
Outlook提示:无法安装或装载加载项vpmsece.dll
查看>>
使用Apache开源POI和jXLS两种API生成报表
查看>>
oracle控制台OEM无法启动
查看>>
haproxy负载均衡
查看>>
clink 让cmd像ubuntu gnome-terminal一样
查看>>