将 spring-boot-starter-parent 从 2.1.1 升级到 2.3.3 后 SQL 语句中的语法错误

Syntax error in SQL statement after upgrading spring-boot-starter-parent from 2.1.1 to 2.3.3

为了测试和调整 Spring Boot 的一些内部结构,我有一个示例 Spring Boot 项目,我经常故意破坏它,并从其内部结构中学习新的东西。

现在,我有一个 Spring 启动项目,带有 pom,例如:

<?xml version='1.0' encoding='UTF-8'?>
<project xmlns='http://maven.apache.org/POM/4.0.0'
         xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
         xsi:schemaLocation='http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd'>
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.test.springboot</groupId>
    <artifactId>spring-boot-application</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.1.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
            <scope>provided</scope>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>

        <dependency>
            <groupId>org.flywaydb</groupId>
            <artifactId>flyway-core</artifactId>
            <version>5.2.4</version>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

和Flyway的迁移,有:

CREATE TABLE PERSON(
    PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    PERSON_NAME VARCHAR(20) NOT NULL,
    PERSON_SURNAME VARCHAR(20) NOT NULL,
    PERSON_AGE BIGINT,
);

工作正常,直到 spring-boot-starter-parent 版本为 2.1.1。

我现在决定升级一些依赖项,看看会如何以及什么会破坏(因为在使用 Spring 基础设施时经常发生)。因此,将 spring-boot-starter-parent 版本升级到 2.3.3 后,上面的 SQL 脚本开始抛出:

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'flywayInitializer' defined in class path resource [org/springframework/boot/autoconfigure/flyway/FlywayAutoConfiguration$FlywayConfiguration.class]: Invocation of init method failed; nested exception is org.flywaydb.core.internal.command.DbMigrate$FlywayMigrateException: 
Migration V1__initial_schema.sql failed

---------------------------------------
SQL State  : 42001
Error Code : 42001
Message    : Syntax error in SQL statement "CREATE TABLE PERSON(
    PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    PERSON_NAME VARCHAR(20) NOT NULL,
    PERSON_SURNAME VARCHAR(20) NOT NULL,
    PERSON_AGE BIGINT,
    )[*]"; expected "identifier"; SQL statement:
CREATE TABLE PERSON(
    PERSON_ID BIGINT AUTO_INCREMENT PRIMARY KEY,
    PERSON_NAME VARCHAR(20) NOT NULL,
    PERSON_SURNAME VARCHAR(20) NOT NULL,
    PERSON_AGE BIGINT,
    ) [42001-200]

坦率地说,尽管异常看起来很清楚,但与此同时,它没有清楚地说明确切的问题是什么,[=42]有点棘手=]猜猜相同的语法如何在稍旧的版本上工作。

我猜测并删除了最后一个逗号(在最后一个 PERSON_AGE BIGINT 列的定义之后),它又开始工作了。

我很想了解幕后真正导致此异常的原因。在升级 spring-boot-starter-parent 时,我真的看不到项目中有任何传递依赖项发生变化,这归咎于任何特定的库或 .jar.. 然而,某些东西 必须是 导致此异常,我想了解 - 是什么。

我已经测试了两种语法(带和不带最后的逗号“,”)并且都工作得很好,作为一个独立的 SQL 查询,在 SQL shell 中;但是,它在上述情况下不起作用。

有人能对此有更多的说明吗?

感谢。

H2 dropped support for trailing commas in 1.4.200. Spring Boot upgraded to H2 1.4.200 在 2.1.10 和 2.2.1 中,在撰写本文时,它已成为所有 Spring 引导版本中 H2 的默认版本。当您升级到 Spring Boot 2.3.3 时,您也会升级到 H2 1.4.200,因此不再支持迁移中的尾随逗号。

如果您对这些版本的来源感到好奇,它们是通过 spring-boot-starter-parent 继承的,它使用 spring-boot-dependencies 作为其父级。 spring-boot-dependencies 包含众多 Spring 项目和第三方依赖项(包括 H2)的依赖项管理。任何给定版本的 Spring Boot 的默认版本都包含在参考文档中: