文档章节

Hibernate4中让SequenceGenerator支持字符类型的方法

李玉珏
 李玉珏
发布于 2015/03/13 13:10
字数 497
阅读 1100
收藏 4

        在Hibernate4中,如果要用SequenceGenerator,其要求数据库中的对应字段为NUMBER等数值类型,但是在具体项目中,因为序列对应的字段往往是主键,虽然是数值但并不参与计算,还有一些其他的原因,往往希望字段定义为字符类型,比如VARCHAR2等,这是合理的需求,本文将提供解决该问题的方法。

        经过研究源代码发现,该问题通过Hibernate扩展的方式,会比较麻烦,修改源代码是比较简单方式,下面介绍具体需要修改的源文件,及具体修改方法。

        需要修改的源文件为org.hibernate.id.SequenceGenerator和org.hibernate.id.IdentifierGeneratorHelper。

        IdentifierGeneratorHelper需要修改的地方较多:

    public static IntegralDataTypeHolder getIntegralDataTypeHolder(Class integralType) {
        if ( integralType == Long.class
                || integralType == Integer.class
                || integralType == Short.class
                || integralType == String.class) {//增加对String的判断
            return new BasicHolder( integralType );
        }
        else if ( integralType == BigInteger.class ) {
            return new BigIntegerHolder();
        }
        else if ( integralType == BigDecimal.class ) {
            return new BigDecimalHolder();
        }
        else {
            throw new IdentifierGenerationException(
                    "Unknown integral data type for ids : " + integralType.getName()
            );
        }
    }

        BasicHolder的构造方法:

        public BasicHolder(Class exactType) {
            this.exactType = exactType;
            if ( exactType != Long.class && exactType != Integer.class && exactType != Short.class && exactType != String.class) {//增加对String的判断
                throw new IdentifierGenerationException( "Invalid type for basic integral holder : " + exactType );
            }
        }

        BasicHolder的makeValue方法:

        public Number makeValue() {
            // TODO : should we check for truncation?
            checkInitialized();
            if ( exactType == Long.class || exactType == String.class) {
                return value;
            }
            else if ( exactType == Integer.class ) {
                return ( int ) value;
            }
            else {
                return ( short ) value;
            }
        }

        

        SequenceGenerator的修改比较简单,修改generate方法即可:

    @Override
    public Serializable generate(SessionImplementor session, Object obj) {
        Number n =generateHolder( session ).makeValue();
        if (identifierType.getReturnedClass() == String.class){//增加对String的判断
            return n.toString();
        }else{
            return n;
        }
    }

        这个修改在4.2.12以上版本(小版本)中测试通过,其他版本未验证。

© 著作权归作者所有

共有 人打赏支持
李玉珏

李玉珏

粉丝 318
博文 66
码字总数 110992
作品 0
沈阳
技术主管
私信 提问
Base64压缩UUID长度替换Hibernate原有UUID生成器

1、背景 在采用Hibernate做对象映射时,我一直都采用UUID来做主键。由于Hibernate的UUID需要占用32位的字符,所以一般都会让人感觉响效率且增加存储占用。 我在查看公司项目时发现了一种比较...

NoahX
2013/05/20
0
13
注意Hibernate4在开发当中的一些改变

注意Hibernate4在开发当中的一些改变 Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。这...

千江
2013/05/24
0
1
注意Hibernate4在开发当中的一些改变

Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。这里简单介绍了hibernate4相对于hiber...

Ida62
2014/03/13
0
0
hibernate4与spring3的整合,不兼容

双休整合下 整合struts2+spring3.2.1+hibernate4.2.1 结果遇到问题如下问题: java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;at......

苏叶晚晚
2013/03/17
0
0
注意Hibernate4在开发当中的一些改变

Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了HibernateTemplate,因为Hibernate4的事务管理已经很好了,不用Spring再扩展了。这里简单介绍了hibernate4相对于hiber...

山海经
2014/03/22
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7重置密码、单用户模式、救援模式、ls命令、chmod命令

在工作当中如果我们错误的配置了文件使服务器不能正常启动或者忘记密码不能登录系统,如何解决这些问题呢?重装系统是可以实现的,但是往往不能轻易重装系统的,下面用忘记密码作为例子讲解如...

李超小牛子
今天
1
0
Python如何开发桌面应用程序?Python基础教程,第十三讲,图形界面

当使用桌面应用程序的时候,有没有那么一瞬间,想学习一下桌面应用程序开发?行业内专业的桌面应用程序开发一般是C++,C#来做,Java开发的也有,但是比较少。本节课会介绍Python的GUI(图形用...

程序员补给栈
今天
5
0
kafka在的使用

一、基本概念 介绍 Kafka是一个分布式的、可分区的、可复制的消息系统。它提供了普通消息系统的功能,但具有自己独特的设计。 这个独特的设计是什么样的呢? 首先让我们看几个基本的消息系统...

狼王黄师傅
今天
3
0
Android JNI总结

0x01 JNI介绍 JNI是Java Native Interface的缩写,JNI不是Android专有的东西,它是从Java继承而来,但是在Android中,JNI的作用和重要性大大增强。 JNI在Android中起着连接Java和C/C++层的作...

天王盖地虎626
昨天
3
0
大数据教程(11.8)Hive1.2.2简介&初体验

上一篇文章分析了Hive1.2.2的安装,本节博主将分享Hive的体验&Hive服务端和客户端的使用方法。 一、Hive与hadoop直接的关系 Hive利用HDFS存储数据,利用MapReduce查询数据。 二、Hive与传统数...

em_aaron
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部