本帖最后由 三胖的减肥之路 于 2017-11-27 18:20 编辑
这几天碰到一个数据库设计,要求所有表的主键是 char类型(18)
也就是说,在目前常用的hibernate的主键生成策略大多不适用,
identity,increment,sequence都是用来生成数字的
uuid可以用来生成字符串,但是长度是32位偏长
所以在这种情况下,只好研究了一下自定义主键生成策略,使用自定义主键生成策略
步骤如下:
1、书写一个类,来实现 implements IdentifierGenerator
[AppleScript] 纯文本查看 复制代码 package core.util;
import java.io.Serializable;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.hibernate.HibernateException;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.id.IdentifierGenerator;
import org.hibernate.persister.entity.AbstractEntityPersister;
public class IdGenerator implements IdentifierGenerator{
private SimpleDateFormat preFix = new SimpleDateFormat("yyyyMMdd");
@Override
public Serializable generate(SessionImplementor session, Object object) throws HibernateException {
//持久化对象
AbstractEntityPersister classMetadata =
(AbstractEntityPersister)session.getFactory()
.getClassMetadata(object.getClass());
String tableName = classMetadata.getTableName();//表名
tableName = tableName.substring(0,5);
String idString = preFix.format(new Date()) + System.currentTimeMillis() % 99; //时间
return tableName+idString;
}
}
2、需要在主键上设置 引用自定义的主键生成策略
[AppleScript] 纯文本查看 复制代码 @Id
@GenericGenerator(name="seq_id", strategy="core.util.IdGenerator")
@GeneratedValue(generator="seq_id")
private String foid; // 唯一ID
3、在网上大多数都是找到了前两步,但是在ssh整合时,只配前两步,会发现无法使用,很是尴尬
后来经过测试得知,需要在spring中管理 自定义的主键生成策略类
[AppleScript] 纯文本查看 复制代码 <bean id="idGenerator" class="core.util.IdGenerator"/>
|