1. 程式人生 > >mybatis一個業務多次提交事務commit造成主鍵不順序遞增(觸發器的原因)

mybatis一個業務多次提交事務commit造成主鍵不順序遞增(觸發器的原因)

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(); } } }
  1. 幾點說明
  • 目的:希望先後地址入庫、訂單入庫、訂單項表入庫,並且主鍵是連續的
  • 現狀:可以入庫,但主鍵不連續
  • 三張表

收貨地址表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

本該到100,實際卻是101);

如果不加1,會報錯:違反完整約束條件,未找到父項關鍵字。

     53行的address.getAddrId()+1也是這樣