mybatis一個業務多次提交事務commit造成主鍵不順序遞增(觸發器的原因)
阿新 • • 發佈:2018-12-31
package com.dangdang.service;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Set;
import java.util.UUID;
import org.apache.ibatis.session.SqlSession;
import com.dangdang.dao.AddressDAO;
import com.dangdang.dao.OrderDAO;
import com.dangdang.dao.OrderDetallDAO;
import com.dangdang.entity.BuyAddress;
import com.dangdang.entity.Order;
import com.dangdang.entity.OrderDetall;
import com.dangdang.entity.User;
import com.dangdang.util.MyBatisUtil;
import com.dangdang.vo.Cart;
import com.dangdang.vo.OrderItem;
public class OrderServiceImpl implements OrderService{
//收貨地址入庫、訂單入庫、訂單項表入庫
@Override
public void orderOrder(BuyAddress address, User user, Cart cart) {
try {
//收貨地址入庫
address.setuId(user.getId());
address.setAddrstatus(0);
address.setIsDefault(0);
//把User物件存放在Buyaddress
address.setUser(user);
AddressDAO ad = (AddressDAO) MyBatisUtil.getMapper(AddressDAO.class);
ad.save(address);
MyBatisUtil.commitForce();
MyBatisUtil.closeSqlSession();
} catch (Exception e) {
MyBatisUtil.rollback();
e.printStackTrace();
}
//訂單入庫
Order order = null;
try {
//生成訂單號onumber
Date date=new Date();
String createTime=new SimpleDateFormat("yyyyMMddHH:mm:ss").format(date);
String onumber = createTime + UUID.randomUUID().toString();
//把User物件、Buyaddress物件存放在Order物件裡
order = new Order(null, cart.getTotalprice(), user.getId(), onumber, user, 1, address.getAddrId()+1, address);
// new Order(orderId, totalp00rice, uid, onumber, user, orderstatus, addrId, address)
OrderDAO od = (OrderDAO) MyBatisUtil.getMapper(OrderDAO.class);
od.save(order);
MyBatisUtil.commitForce();
MyBatisUtil.closeSqlSession();
} catch (Exception e) {
MyBatisUtil.rollback();
e.printStackTrace();
}
//訂單項表入庫
OrderDetallDAO odd = (OrderDetallDAO) MyBatisUtil.getMapper(OrderDetallDAO.class);
try {
Set<Integer> keySet = cart.getCartMap().keySet();
//遍歷cartMap
for (Integer key:keySet) {
// System.out.println(key);
OrderItem orderItem = cart.getCartMap().get(key);
OrderDetall orderDetall = new OrderDetall();
orderDetall.setNumber(orderItem.getAmount());
orderDetall.setTotal(orderItem.getSmallprice());
orderDetall.setOrderid(order.getOrderId()+1);
orderDetall.setGid(orderItem.getGoods().getGID());
//呼叫DAO層
odd.save(orderDetall);
}
MyBatisUtil.commit();
MyBatisUtil.closeSqlSession();
} catch (Exception e) {
MyBatisUtil.rollback();
e.printStackTrace();
}
}
}
- 幾點說明
- 目的:希望先後地址入庫、訂單入庫、訂單項表入庫,並且主鍵是連續的
- 現狀:可以入庫,但主鍵不連續
- 三張表
收貨地址表d_buyaddress(主鍵D_ADDRID)、
訂單表d_buyorder(主鍵d_orderid,外來鍵D_ADDRID)、
訂單項(詳情條目)表d_buyorderdetall(外來鍵d_orderid)
- MyBatisUtil.commitForce();是sqlSession.commit(true);
- 78行order.getOrderId()+1是將錯就錯不得已之舉:
debug時發現order.getOrderId()的值 比 資料庫order表的orderId的值小1(資料庫裡的值比預料的自然遞增數多1,如d_orderid
如果不加1,會報錯:違反完整約束條件,未找到父項關鍵字。
53行的address.getAddrId()+1也是這樣