日期流水号主键生成器

public class DateSeqGenerator implements IdentifierGenerator, 
Configurable {
  // logger
  private static final Log log = LogFactory.getLog(DateSeqGenerator.class);

  // reference to the underlying generator to which we delegate the work
  private String currentDate = "";

  //上次生成标识的日期前缀
  private long day;

  //下一个Sequence值
  private long next;

  //末位序号的位数限制
  private int length = 4;

  //从数据库获取当前最大标识的Sql语句
  private String sql;

  //标识返回值的JAVA类别
  private Class returnClass;

  /**
   * Construct a new DateSeqGenerator
   */
  public DateSeqGenerator() {
super();
  }

  /* (non-Javadoc)  

   

* @see org.hibernate.id.IdentifierGenerator#generate(org.hibernate.engine.SessionImplementor, java.lang.Object)
   */
  public Serializable generate(SessionImplementor session, Object object)
throws SQLException, HibernateException   

  {
    if (sql!=null) {
      getNext( session );
    }

    long currentDay = getCurrentDay();
    if(currentDay != day){
      day = currentDay;
      next = 1l;
    }
    return IdentifierGeneratorFactory.createNumber(day * Math.pow(10l,length) + (next++), returnClass);
  }


/* (non-Javadoc)
* @see org.hibernate.id.Configurable#configure(org.hibernate.type.Type, java.util.Properties, org.hibernate.dialect.Dialect)
*/
public void configure(Type type, Properties params, Dialect dialect)
throws MappingException
{
    String tableList = params.getProperty("tables");
    if (tableList==null) tableList = params.getProperty(PersistentIdentifierGenerator.TABLES);
    String[] tables = StringHelper.split(", ", tableList);
    String column = params.getProperty("column");
    if (column==null) column = params.getProperty(PersistentIdentifierGenerator.PK);
    String numLength = params.getProperty("length");
    if(numLength == null)
      length = 4;
    else
      length = Integer.parseInt(numLength);

    String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);
    String catalog = params.getProperty(PersistentIdentifierGenerator.CATALOG);
    returnClass = type.getReturnedClass();

    StringBuffer buf = new StringBuffer();
    for ( int i=0; i<tables.length; i++ ) {
      if (tables.length>1) {
        buf.append("select ").append(column).append(" from ");
      }
      buf.append( Table.qualify(catalog, schema, tables[i], d.getSchemaSeparator() ) );
      if ( i<tables.length-1) buf.append(" union ");
    }
    if (tables.length>1) {
      buf.insert(0, "( ").append(" ) ids_");
      column = "ids_." + column;
    }

    sql = "select max(" + column + ") from " + buf.toString();
  }

  /**
   * 从数据库检索已有数据标识的最大值

   * @param session
   *
   * @return
  */
  //从数据库获取已有数据的最大ID标识,确定下一标识的值
  private void getNext( SessionImplementor session ) {
  Connection conn = session.connection();
  log.debug("fetching initial value: " + sql);

  try {
    PersistentIdentifierGenerator.SQL.debug(sql);
    PreparedStatement st = conn.prepareStatement(sql);
    ResultSet rs = null;
    try {
      rs = st.executeQuery();
      if ( rs.next() ) {
        next = rs.getLong(1);
        if ( rs.wasNull())
          next = 1l;
        else{
          day = Long.parseLong(next.substring(0,8)) + 1; }
          next = Long.parseLong((next + "").substring(8));
        }
      else {
        next = 1l;
      }
      sql=null;
      log.debug("first free id: " + next);
    }
    finally {
      if (rs!=null) rs.close();
        st.close();
    }
  }
  catch (SQLException sqle) {
    throw JDBCExceptionHelper.convert(
session.getFactory().getSQLExceptionConverter(),
sqle,
"could not fetch initial value",
sql
      );
    }
  }

  /**
   * 从数据库服务器获取当前日期
   *
   * @return long 数据库当前日期,日期格式为'yyyymmdd'
  */
  private long getCurrentDay(){
    String cDate = null;
    /**此部分代码省略**/
    /** 从数据库获取当前日期,返回格式为'yyyymmdd',“20060316”**/
    return cDate;
  }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值