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;
}
}
分享到:
相关推荐
例如,一个简单的流水号可能是按时间顺序生成的日期和时间戳,如"20230408153012",代表2023年4月8日15点30分12秒生成。更复杂的流水号可能包括业务系统的标识符、随机数或者自增序列。 流水号生成软件的设计通常...
这个表将使用函数f_NewBH()来生成流水号,并将其作为主键。 插入数据 现在,我们可以插入数据到表中。我们可以使用以下SQL语句来插入数据: ```sql INSERT table_BH (Pname) VALUES ('张三') INSERT table_BH ...
其中,sCode字段作为主键,用于唯一标识不同的流水号类别,保证了不同类别的流水号不会产生冲突;sName字段用于记录流水号相关的名称或备注信息,便于业务系统进行管理和查询;sQZ字段用作流水号的前缀信息,如公司...
在Java的持久化框架中,如JPA(Java Persistence API)和Hibernate,主键生成策略是数据模型设计的重要部分。主键通常是表中唯一标识记录的一列或一组列,用于确保数据的完整性和唯一性。本篇文章将深入探讨JPA的4种...
用于在数据库中生成数据库表的主键
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
关于Hibernate的各种主键生成策略与配置详解
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...
总的来说,通过存储过程和触发器创建主键生成器是一种自定义主键生成策略的方法,它允许你在满足特定业务需求的同时保持数据的一致性。然而,这种方法可能会增加数据库的复杂性,因此在实际应用中需要权衡性能和维护...
### 主键生成器sequence在Oracle中的应用 #### 一、概述 在数据库设计与开发过程中,经常需要为数据表中的某列(通常是主键)自动分配一个唯一且递增的值,以确保每一行记录的独特性。Oracle数据库提供了一种非常...
Hibernate各种主键生成策略详解,包括 assigned increment hilo seqhilo sequence identity native uuid foreign uuid.hex sequence-identity 等
在Java的持久化框架Hibernate中,主键生成策略是一个关键的概念,它决定了如何为数据库中的实体对象生成唯一的标识符(主键)。以下是关于Hibernate主键生成方式的详细说明: 1. **Identity方式**:`...
### JPA主键生成策略详解 #### 一、概述 持久化对象的主键生成机制在JPA(Java Persistence API)中占据着重要的位置。它不仅关乎数据的唯一标识符如何确定,还与数据的存储效率及应用逻辑紧密相关。JPA通过`@...
java主键生成,通过自定义前缀加时间生成机制,是主流项目的常用方法,有的是通过JAVA实现,有的是通过存储过程,其实都差不多