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>