订单模块类创建及配置
购物完成之后,提交订单,生成一个订单
订单表和商品的关系:
订单和商品的关系是多对多,一个订单可以有多个商品,一个商品可以属于多个订单。
如果是多对多的关系,那么建表的时候应该建第三张表(中间表),存订单表和商品表的id。
中间表:订单项表:
订单表和商品表是多对多关系,可以通过两个一对多的形式完成多对多的关联关系。即商品对订单项是一对多,订单对订单项也是一对多,两个表对中间表的一对多关系相当于商品和订单表的多对多关系。
说下这样处理的好处,如果你把商品表和订单表的关系创建成多对多的关系,中间表只会维护商品id和订单id,中间的订单表的其他字段是不会自动维护的,如果配成一对多,其他自动就可以自动维护。
订单表:
/***
* 订单表
*
*/
@SuppressWarnings("serial")
public class Order implements Serializable {
private long oid;// 订单id
private Double total; // 总计
private Date orderTime;// 订单下单时间
private int state; // 订单状态
private String name;// 用户名
private String addr; // 地址
private String phone;// 用户电话
// 订单所属用户
private User user;
// 订单中包含多个订单项
private Set<OrderItem> orderItems = new HashSet<OrderItem>();
//省略setter getter方法
OrderItem订单项表:
@SuppressWarnings("serial")
public class OrderItem implements Serializable{
private long itemid; //订单项id
private int count; //订单数量
private Double subtotal; //订单小计
// 商品对象
private Product product;
// 订单对象
private Order order;
//省略setter getter方法
Order.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.shopping.order.entity.Order" table="orders">
<id name="oid">
<generator class="native"/>
</id>
<property name="total"/>
<property name="orderTime"/>
<property name="state"/>
<property name="name"/>
<property name="phone"/>
<property name="addr"/>
<!-- 订单与用户关联配置 -->
<!-- 一个用户有多个订单 ,多个订单属于一个用户-->
<many-to-one name="user" lazy="false" class="com.shopping.user.entity.User" column="uid"/>
<!-- 订单与订单项关联配置 -->
<!-- 一个订单包含多个订单项 -->
<set name="orderItems" lazy="false" cascade="save-update">
<key column="oid"/>
<one-to-many class="com.shopping.order.entity.OrderItem"/>
</set>
</class>
</hibernate-mapping>
OrderItem.hbm.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.shopping.order.entity.OrderItem" table="orderitem">
<id name="itemid">
<generator class="native"/>
</id>
<property name="count"/>
<property name="subtotal"/>
<!-- 订单项是多方, product是一方-->
<many-to-one name="product" lazy="false" class="com.shopping.product.entity.Product" column="pid"></many-to-one>
<!-- 订单项是多方 ,order是一方-->
<many-to-one name="order" class="com.shopping.order.entity.Order" column="oid"/>
</class>
</hibernate-mapping>
这里说明一下,在Oder中用到了User对象,表示多个订单属于一个用户,如果你不需要在User中需要Order,则不用写以下代码:
Set<Order> orders = new HashSet<Order>();
//用到就写,不用就可以不用写,不会影响建表
订单模块跳转到订单页面
在购物车页面点击提交订单的时候:
应该跳转到订单页面,订单页面见上面第一张图。
<a href="${ pageContext.request.contextPath }/order_saveOrder.do" id="submit" class="submit">提交订单</a>
OrderAction:
package com.shopping.order.action;
import org.hibernate.criterion.Order;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import com.shopping.base.BaseAction;
@SuppressWarnings("serial")
@Controller
@Scope("prototype")
public class