文档章节

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

李玉珏
 李玉珏
发布于 2015/03/13 13:10
字数 497
阅读 1044
收藏 3
点赞 1
评论 0

        在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以上版本(小版本)中测试通过,其他版本未验证。

© 著作权归作者所有

共有 人打赏支持
李玉珏

李玉珏

粉丝 268
博文 57
码字总数 92115
作品 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
问一下Hibernate4的问题!

Spring 3中怎么对Hibernate4的支持没有HibernateDaoSupport/HibernateTemplate . 用支持Hibernate3的支持出错了... org.springframework.orm-3.1.0.RELEASE.jarorgspringframeworkormhiberna......

PYZWORLD
2012/10/04
1K
4
整合spring3.1和hibernate4

2个都出稳定版了,整合后发现一些改变: Hibernate4 貌似必须JDK1.6+ ;1.5 不行 spring3.1 不在提供hibernateTemplate 这些支持,而是让你直接使用sessionfactory 中的getCurrentSession 方法...

lifigure
2011/12/22
0
2
Hibernate4注解零配置实现表映射

@Entity ,注册在类头上,将一个类声明为一个实体bean(即一个持久化POJO类) 。 @Table ,注册在类头上,注解声明了该实体bean映射指定的表(table)。 @Id用来注册主属性,@GeneratedValue用...

车开源
2016/05/05
81
0
hibernate4的dao基础工具类 的相关问题

@闫洲 你好,想跟你请教个问题:hibernate4的dao基础工具类 在你这个贴子中有个方法 请问这里总是抛出类型转换异常,我的BaseDao 抽取出了一个接口,并没有父类来继承,如何才能获取来entityCla...

wfzlm
2015/05/27
308
0
spring3整合hibernate4出现的问题

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider。 Hibernate3的时候,用spring来控制sessionfactory用的可以是o......

挨踢精英
2015/03/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

CDH的坑之Sqoop导出数据到MySQL

CDH的坑之Sqoop导出数据到MySQL 最近使用Sqoop从Hive导出数据到MySQL中,出现了一系列的问题,下面将这个问题记录一下,避免再度踩坑! 导出语句 sqoop export --connect jdbc:mysql://192....

星汉
8分钟前
0
0
Hyperledger Fabric 客户端开发三

前面两篇文章介绍了Hyperledger Fabric SDK并使用一个实例介绍如何通过SDK和Hyperledger Fabric Blockchain交互, 现在详细分析相关的过程。 首先看 enroll (登录) admin 过程。 'use stric...

十一月不远
9分钟前
0
0
PowerDesigner连接MySQL和逆向工程图

最近想梳理公司项目的表间关系,从项目后台管理系统的操作入手,以及代码的hibernate注解入手,都不算特别尽人意,于是最后还是鼓捣了一下PowerDesigner的逆向工程图,这样更直观一些。 想着...

Oo若离oO
9分钟前
0
0
威胁web应用安全的错误

一般绝大部分的web应用攻击都是没特定目标的大范围漏洞扫描,只有少数攻击确实是为入侵特定目标而进行的针对性尝试。这两种攻击都非常频繁,难以准确检测出来,许多网站的web应用防火墙都无法...

上树的熊
12分钟前
2
0
pypy2 install crypto error

install pycryptodome instead pip install pycryptodome

coord
16分钟前
0
0
Service Mesh所应对的8项挑战

Lori Macvittie 微服务架构是把双刃剑,我们享受它带来的开发速度(development velocity),却也不得不面对服务间通讯带来的复杂性问题。 目前大多数扩展容器化微服务的架构多是基于proxy-b...

好雨云帮
25分钟前
0
0
时间复杂度

1. 维基上的定义 在计算机科学中,算法的时间复杂度是一个函数,它定性描述该算法的运行时间。这是一个代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低...

liuyan_lc
31分钟前
0
0
js中的~符

~是js里的按位取反操作符,~~就是执行两次按位取反,其实就是保持原值,但是注意虽然是原值,但是对布尔型变量执行这个操作,会转化成相应的数值型变量,也就是 ~~true === 1,~~false === 0...

JamesView
32分钟前
0
0
webpack安装

npm install --save-dev webpack-cli

Vincent-Duan
34分钟前
0
0
实时监听EditText内容变化

主要是addTextChangedListener方法的使用 aswerEdittext.addTextChangedListener(new TextWatcher() { //编辑框的内容发生改变之前的回调方法 @Override public void before...

王先森oO
37分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部