Spring 批处理在 H2 的 SQL 语句中创建语法错误
Spring Batch creates syntax errors in SQL statements for H2
我从 Spring Boot & Batch 1.5.9 升级到 Spring Boot & Batch 2.5.6。
现在我遇到了 Spring 批处理模式初始化的问题。
我在 JUnit5 测试中 运行 H2 class。
首先尝试通过 Spring 批处理初始化:
spring:
batch:
jdbc:
initialize-schema: "always"
它创建序列但不创建任何 table。
查看跟踪,它显示创建 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 文档放置所有 SQL
https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#exampleDDLScripts
进入 schema.sql。
并且所有 table 和序列都已正确创建。
但是,启动 Spring 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 中的解决方法序列 tables 不支持序列的数据库批处理也没有该列。
数据库已正确配置为 H2 数据库(未尝试其他数据库)。
为什么Spring批处理每次都创建错误的SQL语句?
谁能指出正确的方向?
解决方案是H2版本。
我们还将 H2 升级到 2.0,但该版本与 Spring Batch 4.3.4 不兼容。
降级到 H2 版本 1.4.200 解决了这个问题。
MODE=LEGACY
将通过 Spring boot 2.6.x 解决 H2 2.x 上的问题。
(nextval
将重新启用支持)
查看详情:https://github.com/spring-projects/spring-boot/issues/29034#issuecomment-1002641782
我从 Spring Boot & Batch 1.5.9 升级到 Spring Boot & Batch 2.5.6。 现在我遇到了 Spring 批处理模式初始化的问题。 我在 JUnit5 测试中 运行 H2 class。 首先尝试通过 Spring 批处理初始化:
spring:
batch:
jdbc:
initialize-schema: "always"
它创建序列但不创建任何 table。 查看跟踪,它显示创建 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 文档放置所有 SQL https://docs.spring.io/spring-batch/docs/current/reference/html/schema-appendix.html#exampleDDLScripts 进入 schema.sql。 并且所有 table 和序列都已正确创建。 但是,启动 Spring 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 中的解决方法序列 tables 不支持序列的数据库批处理也没有该列。
数据库已正确配置为 H2 数据库(未尝试其他数据库)。
为什么Spring批处理每次都创建错误的SQL语句? 谁能指出正确的方向?
解决方案是H2版本。 我们还将 H2 升级到 2.0,但该版本与 Spring Batch 4.3.4 不兼容。 降级到 H2 版本 1.4.200 解决了这个问题。
MODE=LEGACY
将通过 Spring boot 2.6.x 解决 H2 2.x 上的问题。
(nextval
将重新启用支持)
查看详情:https://github.com/spring-projects/spring-boot/issues/29034#issuecomment-1002641782