jpa Spring Batch在H2的SQL语句中创建语法错误

hgncfbus  于 12个月前  发布在  Spring
关注(0)|答案(3)|浏览(252)

我将Sping Boot & Batch从1.5.9升级到Sping Boot & Batch 2.5.6。现在我在Spring Batch模式初始化方面遇到了问题。我正在JUnit 5测试类中运行H2。第一次尝试是通过Spring Batch初始化:

spring:
  batch:
    jdbc:
      initialize-schema: "always"

字符串
它创建了Sequences,但没有创建任何表。查看跟踪,它显示了create table SQL中的语法错误:SQL语句中的语法错误(一个示例):

CREATE TABLE BATCH_JOB_INSTANCE ( JOB_INSTANCE_ID BIGINT IDENTITY[*] NOT NULL PRIMARY KEY , VERSION BIGINT , JOB_NAME VARCHAR(100) NOT NULL, JOB_KEY VARCHAR(32) NOT NULL, CONSTRAINT JOB_INST_UN UNIQUE (JOB_NAME, JOB_KEY) )


事实上,检查qith H2控制台或SQL linter,它将“IDENTITY[*]”标记为错误,如果没有,它将在H2中工作。
第二次尝试也失败了。我把

spring:
  batch:
    jdbc:
      initialize-schema: "never"


并按照Spring文档https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#exampleDDLScripts将所有SQL放入schema.sql中。所有表和序列都正确创建。但Sping Boot 启动失败,错误为:

Could not obtain sequence value; nested exception is org.h2.jdbc.JdbcSQLSyntaxErrorException: Field "BATCH_JOB_SEQ.NEXTVAL" not found
Column "BATCH_JOB_SEQ.NEXTVAL" not found; SQL statement:
select BATCH_JOB_SEQ.nextval from dual [42122-204]


当然,序列没有列“nextval”,因为它是一个序列。即使是Spring Batch中不支持序列的数据库的解决方案序列表也没有该列。
数据库已正确配置为H2数据库(未尝试其他数据库)。
为什么Spring Batch每次都创建错误的SQL语句?有人能指出正确的方向吗?

uyto3xhc

uyto3xhc1#

解决方案是H2版本。我们也将H2升级到2.0,但该版本与Spring Batch 4.3.4不兼容。降级到H2版本1.4.200解决了这个问题。

hjqgdpho

hjqgdpho2#

MODE=LEGACY将通过Sping Boot 2.6.x解决H2 2.x上的问题。(nextval支持将重新启用)
查看详情:https://github.com/spring-projects/spring-boot/issues/29034#issuecomment-1002641782

hsgswve4

hsgswve43#

需要删除h2数据库来解决此问题。然后重新运行应用程序。

DeleteDbFiles.execute(dbDir, dbName, true);

字符串

相关问题