快速业务通道

hibernate中自定义主键生成器 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

hibernate中自定义主键生成器

时间:2011-01-31

Hibernate(目前使用的版本是3.2)中提供了多种生成主键的方式。

然而当前的这么多种生成方式未必能满足我们的要求.

比如increment,可以在一个hibernate实例的应用上很方便的时候,但是在集群的时候就不行了.

再如 identity ,sequence ,native 是数据局提供的主键生成方式,往往也不是我们需要,而且在程序跨数据库方面也体现出不足.

还有基于算法的生成方式生成出来的主键基本都是字符串的.

我们现在需要一种生成方式:使用Long作为主键类型,自动增,支持集群.

那么我们需要自定义一个我们的主键生成器才能实现了.

实现代码:

package hibernate; import java.io.Serializable; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.Properties; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.dialect.Dialect; import org.hibernate.engine.SessionImplementor; import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.type.Type; public class IncrementGenerator implements IdentifierGenerator, Configurable { private static final Log log = LogFactory.getLog(IncrementGenerator.class); private Long next; private String sql; public Serializable generate(SessionImplementor session, Object object) throws HibernateException { if (sql!=null) { getNext( session.connection() ); } return next; } public void configure(Type type, Properties params, Dialect d) throws MappingException { String table = params.getProperty("table"); if (table==null) table = params.getProperty(PersistentIdentifierGenerator.TABLE); String column = params.getProperty("column"); if (column==null) column = params.getProperty(PersistentIdentifierGenerator.PK); String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA); sql = "select max("+column +") from " + ( schema==null ? table : schema + ''.'' + table ); log.info(sql); } private void getNext(Connection conn) throws HibernateException { try { PreparedStatement st = conn.prepareStatement(sql); ResultSet rs = st.executeQuery(); if ( rs.next() ) { next = rs.getLong(1) + 1; } else { next = 1l; } }catch(SQLException e) { throw new HibernateException(e); } finally { try{ conn.close(); }catch(SQLException e) { throw new HibernateException(e); } } } }

配置:

在对应的hbm文件里面将id的配置如下:

<id name="id" type="long" column="id" > <generator class="hibernate.IncrementGenerator" /> </id>

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号