hibernate中自定义主键生成器

最近参考网上牛人的文章,因为毕业设计的需要,所以学了一下怎样实现hibernate自定义主键,挺好用的。内容如下:

背景:
Hibernate(目前使用的版本是3.2)中提供了多种生成主键的方式.在下面的文章中有列出来
[hibernate]Hibernate主键生成方式 Key Generator

然而当前的这么多种生成方式未必能满足我们的要求.
比如increment,可以在一个hibernate实例的应用上很方便的时候,但是在集群的时候就不行了.
再如 identity ,sequence ,native 是数据局提供的主键生成方式,往往也不是我们需要,而且在程序跨数据库方面也体现出不足.
还有基于算法的生成方式生成出来的主键基本都是字符串的.

我们现在需要一种生成方式:使用Long作为主键类型,自动增,支持集群.
那么我们需要自定义一个我们的主键生成器才能实现了.

实现代码:

Java代码 复制代码
  1. package hibernate;   
  2.   
  3. import java.io.Serializable;   
  4. import java.sql.Connection;   
  5. import java.sql.PreparedStatement;   
  6. import java.sql.ResultSet;   
  7. import java.sql.SQLException;   
  8. import java.util.Properties;   
  9.   
  10. import org.apache.commons.logging.Log;   
  11. import org.apache.commons.logging.LogFactory;   
  12. import org.hibernate.HibernateException;   
  13. import org.hibernate.MappingException;   
  14. import org.hibernate.dialect.Dialect;   
  15. import org.hibernate.engine.SessionImplementor;   
  16. import org.hibernate.id.Configurable;   
  17. import org.hibernate.id.IdentifierGenerator;   
  18. import org.hibernate.id.PersistentIdentifierGenerator;   
  19. import org.hibernate.type.Type;   
  20.   
  21.   
  22. public class IncrementGenerator implements IdentifierGenerator, Configurable {   
  23.     private static final Log log = LogFactory.getLog(IncrementGenerator.class);   
  24.     private Long next;   
  25.     private String sql;   
  26.     public Serializable generate(SessionImplementor session, Object object)   
  27.             throws HibernateException {   
  28.         if (sql!=null) {   
  29.             getNext( session.connection() );   
  30.         }   
  31.        return next;   
  32.   
  33.     }   
  34.        
  35.     public void configure(Type type, Properties params, Dialect d) throws MappingException {   
  36.         String table = params.getProperty("table");   
  37.         if (table==null) table = params.getProperty(PersistentIdentifierGenerator.TABLE);   
  38.         String column = params.getProperty("column");   
  39.         if (column==null) column = params.getProperty(PersistentIdentifierGenerator.PK);   
  40.         String schema = params.getProperty(PersistentIdentifierGenerator.SCHEMA);   
  41.         sql = "select max("+column +") from " + ( schema==null ? table : schema + '.' + table );   
  42.         log.info(sql);   
  43.     }   
  44.        
  45.      private void getNext(Connection conn) throws HibernateException {   
  46.             try {   
  47.                 PreparedStatement st = conn.prepareStatement(sql);   
  48.                 ResultSet rs = st.executeQuery();   
  49.                 if ( rs.next() ) {   
  50.                     next = rs.getLong(1) + 1;   
  51.                 }   
  52.                 else {   
  53.                     next = 1l;   
  54.                 }   
  55.             }catch(SQLException e)   
  56.             {   
  57.                 throw new HibernateException(e);   
  58.             }   
  59.             finally {   
  60.                 try{   
  61.                 conn.close();   
  62.                 }catch(SQLException e)   
  63.                 {   
  64.                     throw new HibernateException(e);   
  65.                 }   
  66.             }   
  67.         }   
  68. }  


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

Java代码 复制代码
  1. <id name="id" type="long" column="id" >   
  2.             <generator class="hibernate.IncrementGenerator" />    
  3.         </id>  

 

 

posted on 2010-01-31 09:57 流浪汉 阅读(535) 评论(0)  编辑 收藏 引用 所属分类: java

只有注册用户登录后才能发表评论。
<2025年1月>
2930311234
567891011
12131415161718
19202122232425
2627282930311
2345678

导航

统计

公告

请你看完我的博客后,留下你对你看的日志或文章的一些意见和建议。

常用链接

留言簿

随笔分类

随笔档案

文章分类

新闻档案

相册

软件开发技术

搜索

最新评论

阅读排行榜

评论排行榜