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;
}
}
日期流水号主键生成器
最新推荐文章于 2024-09-21 10:38:43 发布