A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 三胖的减肥之路 于 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"/>


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马