项目中有这样的需求:每天从00001开始生成5位的流水号,比如2012年9月16日,00001、00002、......99999,到2012年9月17日,又从00001开始。而且系统重启后依然需要保持流水性,重启前是00012,那么重启后需要从00013开始。
选择的一个方案就是将流水号保存到数据库。
1、流水号实体
/** * 流水号 * @author Luxh * 2012-9-16 */ public class SerialNumber { private String id; /** * 流水号 */ private Integer serialNo; /** * 生成日期(格式:yyyyMMdd) */ private String generateDate; //getter/setter方法 //... }
2、流水号实体对应的数据表
3、生成流水号的程序
/** * 生成流水号 * @return */ public String generateSerialNumber() { //当天的初始化流水号为1 Integer serialNo = 1; //查询当天的下一个流水号 String hql = "SELECT max(t.serialNo+1) FROM SerialNumber t WHERE t.generateDate=?"; String generateDate = DateUtils.formatDate(new Date(), "yyyyMMdd"); Object obj = session.createQuery(hql).setParameter(0, generateDate).uniqueResult(); if(obj != null) { serialNo = (Integer) obj; } //将当前序列号保存到数据库 SerialNumber sn = new SerialNumber(); sn.setSerialNo(serialNo); sn.setGenerateDate(generateDate); session.save(sn); //将流水号格式化为 "00001" 5位长度返回 return String.format("%05d", serialNo); }