<b>hibernate中自定义主键生成器</b>[Java编程]
本文“<b>hibernate中自定义主键生成器</b>[Java编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:
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>
以上是“<b>hibernate中自定义主键生成器</b>[Java编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
本文地址: | 与您的QQ/BBS好友分享! |