熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

hibernate中自定義主鍵生成器

2013-11-23 20:32:25  來源: Java開源技術 

  Hibernate(目前使用的版本是)中提供了多種生成主鍵的方式

  然而當前的這麼多種生成方式未必能滿足我們的要求

  比如increment可以在一個hibernate實例的應用上很方便的時候但是在集群的時候就不行了

  再如 identity sequence native 是數據局提供的主鍵生成方式往往也不是我們需要而且在程序跨數據庫方面也體現出不足

  還有基於算法的生成方式生成出來的主鍵基本都是字符串的

  我們現在需要一種生成方式使用Long作為主鍵類型自動增支持集群

  那麼我們需要自定義一個我們的主鍵生成器才能實現了

  實現代碼:
package hibernate;

import javaioSerializable;
import javasqlConnection;
import javasqlPreparedStatement;
import javasqlResultSet;
import javasqlSQLException;
import javautilProperties;

import monsloggingLog;
import monsloggingLogFactory;
import orghibernateHibernateException;
import orghibernateMappingException;
import orghibernatedialectDialect;
import orghibernateengineSessionImplementor;
import orghibernateidConfigurable;
import orghibernateidIdentifierGenerator;
import orghibernateidPersistentIdentifierGenerator;
import orghibernatetypeType;


public class IncrementGenerator implements IdentifierGenerator Configurable {
private static final Log log = LogFactorygetLog(IncrementGeneratorclass);
private Long next;
private String sql;
public Serializable generate(SessionImplementor session Object object)
throws HibernateException {
if (sql!=null) {
getNext( nnection() );
}
return next;

}

public void configure(Type type Properties params Dialect d) throws MappingException {
String table = paramsgetProperty(table);
if (table==null) table = paramsgetProperty(PersistentIdentifierGeneratorTABLE);
String column = paramsgetProperty(column);
if (column==null) column = paramsgetProperty(PersistentIdentifierGeneratorPK);
String schema = paramsgetProperty(PersistentIdentifierGeneratorSCHEMA);
sql = select max(+column +) from + ( schema==null ? table : schema + + table );
(sql);
}

private void getNext(Connection conn) throws HibernateException {
try {
PreparedStatement st = connprepareStatement(sql);
ResultSet rs = stexecuteQuery();
if ( rsnext() ) {
next = rsgetLong() + ;
}
else {
next = l;
}
}catch(SQLException e)
{
throw new HibernateException(e);
}
finally {
try{
connclose();
}catch(SQLException e)
{
throw new HibernateException(e);
}
}
}
}


配置:
在對應的hbm文件裡面將id的配置如下:
<id name=id type=long column=id >
<generator class=hibernateIncrementGenerator />
</id>


From:http://tw.wingwit.com/Article/program/Java/ky/201311/28631.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.