/**
*hibernate ID策略生成器 自定义 - 规则: 业务编号 + 日期 + 六位自增长序列
*/
public class MyKeyGenerator implements IdentifierGenerator, Configurable {
private static final Log log = LogFactory.getLog(MyKeyGenerator.class);
private long next;
private String sql;
private String table;
private String column;
private String schema;
public synchronized Serializable generate(SessionImplementor session,
Object object) throws HibernateException {
SimpleDateFormat f = new SimpleDateFormat("yyMMdd");
String preDate = f.format(new Date());
LogAction logaction = new LogAction();
// String bh = logaction.getBh();
String bh = "123456789";
return bh + preDate + getNext(session, bh,table);
}
public void configure(org.hibernate.type.Type type, Properties params,
Dialect d) throws MappingException {
table = params.getProperty("table");
if (table == null)
table = params.getProperty(PersistentIdentifierGenerator.TABLE);
column = params.getProperty("column");
if (column == null)
column = params.getProperty(PersistentIdentifierGenerator.PK);
schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);
}
/**
* 得到当前表ID的最后六位的最大数
*
* @param session
* @param jsbh
* @return
*/
private String getNext(SessionImplementor session, String bh,String table) {
sql = "select max(substr("+column+",16)) from "+(schema == null ? table : schema + '.' + table)+" where substr("+column+",10,6) = to_char(sysdate,'yyMMdd') and substr("+column+",0,9) = '" + bh + "' and length("+column+")=21 ";
log.info("fetching initial value: " + sql);
try {
PreparedStatement st = session
.getBatcher()
.prepareSelectStatement(
sql);
try {
ResultSet rs = st.executeQuery();
try {
if (rs.next()) {
next = rs.getLong(1) + 1;
if (rs.wasNull())
next = 1;
} else {
next = 1;
}
sql = null;
log.debug("first free id: " + next);
} finally {
rs.close();
}
} finally {
session.getBatcher().closeStatement(st);
}
return toString(6, next);
} catch (SQLException sqle) {
throw JDBCExceptionHelper.convert(session.getFactory()
.getSQLExceptionConverter(), sqle,
"could not fetch initial value for increment generator",
sql);
}
}
/**
* 格式化数字不足补齐
*
* @param num
* @param value
* @return
*/
public static String toString(int num, long value) {
String result = (new Long(value)).toString();
while (num > result.length()) {
result = "0" + result;
}
return result;
}
JAVA中注解使用方法:
@Id @GeneratedValue(generator="custom-id")
@GenericGenerator(name="custom-id", strategy = "javacommon.base.AwdKeyGenerator")
@Column(name = "ID", unique = true, nullable = false, insertable = true, updatable = true, length = 21)
public java.lang.String getId() {
return this.id;
}
0 0 0
(请您对文章做出评价)
分享到:
相关推荐
在Java的持久化框架Hibernate中,ID生成策略是至关重要的一个环节。它是用来唯一标识数据库中每一行记录的关键部分。本教程将详细讲解Hibernate中的ID生成策略,以及如何在实际项目中灵活应用。 首先,ID生成策略是...
+----doc +-----jeecms基础概念.txt +-----图文安装JDK+TOMCAT+MYSQL配置指南.doc +----jeecms +-----源码 +----JEECMS v2.3.2 Final版发布公告.txt +----readme.txt +----框架简介.txt JEECMS是JavaEE版网站...
关于Hibernate的各种主键生成策略与配置详解
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它极大地简化了 Java 应用程序与数据库之间的交互过程。在使用 Hibernate 进行持久化操作时,经常需要处理实体类...
### 常用Hibernate主键生成策略详解 #### 一、引言 在数据库设计与操作过程中,主键是确保数据唯一性的关键要素之一。在实际应用中,开发者经常需要处理不同类型的数据库,并且需要应对各种不同的主键生成需求。...
- 对于复杂的业务场景,可能需要编写自定义的代码生成逻辑,这时可以利用`Hibernate-tools`提供的API进行扩展。 总结,`Hibernate-tools`是Hibernate生态中不可或缺的一部分,它极大地提高了开发效率,同时也为...
### Hibernate 主键生成策略详解 #### 一、概述 Hibernate 是一款开源的对象关系映射 (ORM) 框架,它允许开发人员将 Java 对象映射到数据库表中的记录,从而极大地简化了数据访问层的开发工作。在 Hibernate 中,...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
JAVA ID生成策略是一种在Hibernate框架中使用的策略,用于生成实体类的主键值。这种策略在Annotation情况下,主要有三种方式生成主键值。 第一种方式是使用数据库的自动增长字段生成。这种方式使用@GeneratedValue...
本资料集合了"零基础学Java_Web开发:JSP+Servlet+Struts+Spring+Hibernate+Ajax",涵盖了从初级到进阶的重要概念,帮助初学者系统地掌握Web开发技能。 1. **JSP(JavaServer Pages)技术**: JSP是Java平台上的...
该资源为eclipse开发 提供数据库 源代码 且有大量注释 方便ssh和Ajax初学者和参考者学习和使用 该技术资源包括一下技术:struts+Hibernate+Spring+Ajax 技术集成强大 且功能设计不错 是一不错的参考网站。...
《JavaWeb整合开发完全自学手册》介绍如何整合Struts+Hibernate+Spring+Eclipse进行J2EE开发,所有实例都基于MyEclipseIDE开发,引领读者快速进入基于JavaWeb的J2EE应用领域。《JavaWeb整合开发完全自学手册》主要...
- 自定义 Hibernate 用于转换 Java 名称至 SQL 名称的策略。 - **XML 配置文件** - 使用 XML 文件指定配置选项。 - **J2EE 应用服务器集成** - **事务策略配置** - 配置 JTA 事务管理器。 - **JNDI-bound ...
在Java Web开发中,分页是常见的功能,用于处理大量数据时提高页面加载速度和用户体验。本项目结合了Java、Hibernate、JSP以及TLD(Tag Library Descriptor)技术,实现了一个高效、易懂且实用的自定义标签分页解决...
此外,它还支持复杂的类型映射,如集合、Map以及自定义类型,同时提供了注解支持,使得我们可以通过注解来定制序列化和反序列化的规则。 在SSH(Spring、Struts、Hibernate)框架的集成应用中,Jackson库经常被用作...