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

本文讨论了从使用Hibernate3到Hibernate4时遇到的数据库ID生成策略变化导致的问题,以及如何解决在将现有应用从Hibernate3迁移到Hibernate4时出现的ID为NULL的问题。主要关注于Hibernate在处理GenerationType.AUTO时的行为差异,以及如何通过调整配置来解决此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

之前写了个小应用,用的是嵌入式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还得写歌数据导入导出……

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值