使用hilo高低位算法-生成商品编号

13 篇文章 0 订阅
/** 高低位算法*/
private class HiloOptimizer {

        private String prefix;  //前缀
        private int maxLo;
        private int lo;            
        private long hi;        
        private long lastValue;

        public HiloOptimizer(String prefix, int maxLo) {
            this.prefix = prefix != null ? prefix.replace("{", "${") : "";
            this.maxLo = maxLo;            //最大低位
            this.lo = maxLo + 1;           //最低初始位
        }

        public synchronized String generate() {
            if (lo > maxLo) {                    //当低位超过最大高位
                lastValue = getLastValue();  //表示hi位的进位次数,从数据库id管理表获取
                lo = lastValue == 0 ? 1 : 0;     //低位归0
                hi = lastValue * (maxLo + 1);    //高位进位
            }
            return String.valueOf(hi + lo++);    //低位最后自增lo++
        }
    }

@Transactional
	private long getLastValue(Type type) {
		String jpql = "select sn from Sn sn where sn.type = :type";
		Sn sn = entityManager.createQuery(jpql, Sn.class)//
				.setParameter("type", type)//
				.setFlushMode(FlushModeType.COMMIT)//
				.setLockMode(LockModeType.PESSIMISTIC_WRITE)//
				.getSingleResult();//
		long lastValue = sn.getLastValue();
		sn.setLastValue(lastValue + 1);
		entityManager.merge(sn);
		return lastValue;
	}
public String generate(Type type) {
		Assert.notNull(type);

		String sn = null;

		switch (type) {

		case product:
			sn = productHiloOptimizer.generate();
			break;

		case order:
			sn = orderHiloOptimizer.generate();
			break;

		case payment:
			sn = paymentHiloOptimizer.generate();
			break;

		case slip:
			sn = slipHiloOptimizer.generate();
			break;

		case refunds:
			sn = refundsHiloOptimizer.generate();
			break;

		case shipping:
			sn = shippingHiloOptimizer.generate();
			break;

		case returns:
			sn = returnsHiloOptimizer.generate();
			break;

		case merchant:
			sn = merchantHiloOptimizer.generate();
			break;

		case merchantStore:
			sn = merchantStoreHiloOptimizer.generate();
			break;

		case accountDetail:
			sn = accountDetailHiloOptimizer.generate();
			break;
			
		case cashOrder:
			sn = cashorderHiloOptimizer.generate();
			break;
			
		case refundOrder:
			sn = refundorderHiloOptimizer.generate();
			break;
		}
		return sn;
	}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值