Spring Boot Sping Boot 2.7.0 Liquibase失败,出现“Migration files for change set”

rvpgvaaj  于 2023-05-17  发布在  Spring
关注(0)|答案(4)|浏览(230)

我使用的是Sping Boot 2.6.8沿着Liquibase,它们工作得很好。在生产环境中运行时,它与MySQL数据库一起使用。对于集成测试,我们针对内存数据库中的H2运行它。
由于升级到SB 2.7.0,将H2 v1.4.200切换到v2.1.212,Liquibase随后因H2在内存数据库中而失败。

Exception encountered during context initialization - cancelling refresh attempt: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'liquibase' defined in class path resource [org/springframework/boot/autoconfigure/liquibase/LiquibaseAutoConfiguration$LiquibaseConfiguration.class]: 
Invocation of init method failed; nested exception is liquibase.exception.LiquibaseException: liquibase.exception.MigrationFailedException: Migration failed for change set changelog/0.3.0/tables/file_type.xml::1437572803912-1::bobd (generated):
Reason: liquibase.exception.DatabaseException: Syntax error in SQL statement "CREATE TABLE PUBLIC.FILE_TYPE (ID INT[*](10) GENERATED BY DEFAULT AS IDENTITY NOT NULL, NAME VARCHAR(45) NOT NULL, CONSTRAINT PK_FILE_TYPE PRIMARY KEY (ID))";
expected "ARRAY, INVISIBLE, VISIBLE, NOT, NULL, AS, DEFAULT, GENERATED, ON, NOT, NULL, AUTO_INCREMENT, DEFAULT, NULL_TO_DEFAULT, SEQUENCE, SELECTIVITY, COMMENT, CONSTRAINT, COMMENT, PRIMARY, UNIQUE, NOT, NULL, CHECK, REFERENCES, AUTO_INCREMENT, ,, )";
SQL statement: CREATE TABLE PUBLIC.FILE_TYPE (ID INT(10) GENERATED BY DEFAULT AS IDENTITY NOT NULL, NAME VARCHAR(45) NOT NULL, CONSTRAINT PK_FILE_TYPE PRIMARY KEY (ID)) [42001-212] 
[Failed SQL: (42001) CREATE TABLE PUBLIC.FILE_TYPE (ID INT(10) GENERATED BY DEFAULT AS IDENTITY NOT NULL, NAME VARCHAR(45) NOT NULL, CONSTRAINT PK_FILE_TYPE PRIMARY KEY (ID))]

现在Liquibase应该能够将我们的更新日志Map到MySQL或H2(或任何其他数据库),对吗?所以我认为这是Liquibase不支持H2 v2.x的问题?或者也许有一个属性,我已经错过了,现在需要设置?
TIA。

6qfn3psc

6qfn3psc1#

我在迁移到Sping Boot 2.7.0时遇到了类似的错误。在我的例子中,它涉及到新的H2保留字“值”。我猜,在你的例子中,问题是在 INT 之后的标记 (10) 中。
以下是Sping Boot 文档中H2 2.1部分的引用:
Sping Boot 2.7已经升级到H2 2.1.120。H2 2.x是向后不兼容的,并修复了许多安全漏洞。有关更改的详细信息以及如何处理升级,请参阅H2 changelogmigration guide

knsnq2tg

knsnq2tg2#

我得到了同样的错误使用MS SQL Server数据库,我解决了问题,配置休眠方言和H2在SQL Server模式中的application.properties文件中的测试资源文件夹。

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.SQLServer2016Dialect
spring.datasource.url=jdbc:h2:mem:testdb;MODE=MSSQLServer

或者,您可以禁用liquibase并允许自动生成表spring.liquibase.enabled=false

1tuwyuhd

1tuwyuhd3#

我有这个问题,并通过将h2降级到较低版本来修复

testImplementation 'com.h2database:h2:1.4.200'

另一种解决方案是H2 Google Group中讨论的,其中h2引擎mode.limit设置在dataSourcebean中

@TestConfiguration
public class DataSourceTestConfig {

    @Bean
    public DataSource dataSource() {
        // Fix for the H2 2.x issue with spring boot 2.7.
        org.h2.engine.Mode mode = org.h2.engine.Mode.getInstance("Oracle");
        mode.limit = true;
        return new EmbeddedDatabaseBuilder() //
                .setType(H2) //
                .setName("testdb-h2;MODE=Oracle") //
                .ignoreFailedDrops(true) //
                .build();
    }

}
kiz8lqtg

kiz8lqtg4#

为了完整起见,我在Liquibase Github repo上重新创建了一个示例bug。后来被开发人员修复了。

相关问题