之前写了个小应用,用的是嵌入式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还得写歌数据导入导出……
忒麻烦了,暂时搁置吧……