|
经查看资料values nextval for seq_id (seq_id是序列名)是不正确的,可能是DB8G之前版本使用的语句,在使用pcome登录主机db28G数据库后,执行插入语句,使用序列时要使用next value for seq_id
我修改了hibernate的org.hibernate.dialect.DB2Dialect里面的
getSequenceNextValString(String sequenceName)方法
原方法如下:
|
把返回值改为:"next value for"+sequenceName
然后重新编译DB2Dialect.java,生成的class文件,替换hibernate3.jar中的class
错误依旧:Could not get next sequence value
后来又查看了那些类调用了getSequenceNextValString方法,结果发现在org.hibernate.id.equenceGenerator.java里调用了该方法:
首先
构造函数调用getSequenceNextValString给成员变量sql赋值
|
最后在AccessCallback buildCallback(final SessionImplementor session)方法里调用了
|
就是这里来,hibernate在这里获得序列的下一个值,
而不是在sql语句(如insert into)中使用next value for seq_id
next value for不是合法的sql语句,所以不会获得序列值
在db8G for zos中是使用sql语句:SELECT NEXT VALUE FOR seq_name FROM SYSIBM.SYSDUMMY1 来获得下一个序列值得
所以要是用hibernate使用序列,就要把DB2Dialect返回值改成这样:
|
修改完毕,重新编译改java文件,生成的class文件,替换hibernate3.jar中的class,
就可以使用hibernate使用db2 for zos的序列了