日期:2014-05-16  浏览次数:20375 次

升级Hibernate带来的ID生成策略问题

之前写了个小应用,用的是嵌入式JavaDB + Hibernate3.6之前的版本(具体记不清了,总之就是buildSessionFactory()还没有过时的时候)

最近想把他换成Hibernate4.2.0。

照理说,只要把buildSessionFactory(),改成这样:

            Properties properties = configuration.getProperties();
            ServiceRegistryBuilder serviceRegistryBuilder = new ServiceRegistryBuilder().applySettings(properties);
            serviceRegistry = serviceRegistryBuilder.buildServiceRegistry();
            sessionFactory = configuration.buildSessionFactory(serviceRegistry);

?关闭的时候destroy一下:

        if (serviceRegistry instanceof StandardServiceRegistryImpl) {
            ((StandardServiceRegistryImpl) serviceRegistry).destroy();
        }

?就好了。

?

谁成想,在IDE里运行的时候,每次插入一个新的Entity,就告诉我不能插入ID为NULL的记录。

ID明明做了注释:

@GeneratedValue(strategy = GenerationType.AUTO)

?应该插入的时候Hibernate自己生成值的……

?

左找,右找,找不到原因。

正郁闷的时候,随手点了下dist里面打包好的jar……

应用启动之后,新建了一个数据库……

再插入Entity……竟然正常了……

?

这时候注意到,IDE里测试用的数据库,是Hibernate3X生成的。

回想起来,之前用3x的时候,生成的id都是一长串的Long值(看起来比较像根据时间生成的)。

而在别的应用里,Hibernate4.2生成的数据库,id是顺序增加的。

?

怀疑,之前的Hibernate在处理GenerationType.AUTO的时候,是ORM赋值。

而新的Hibernate,会把这个问题交给数据库自己管理。

于是4.2建立的数据库,应该和3x时候不同(带分配ID的功能神马的)。

当用4.2向3x建立的数据库里插入数据的时候,由于ORM和数据库自身都没有分配ID。于是就出现了id为null的情况。

?

不知道serviceRegistry有没有什么属性,能设定:处理GenerationType.AUTO时,优先使用的策略。

目前这么看来,要想升级Hibernate还得写歌数据导入导出……

忒麻烦了,暂时搁置吧……