首页 > Web开发 > 详细

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

时间:2015-03-13 14:41:39      阅读:757      评论:0      收藏: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以上版本(小版本)中测试通过,其他版本未验证。

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

原文:http://my.oschina.net/liyuj/blog/386582

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!