如何使用 Liquibase Hibernate 扩展通过 Quarkus 生成 Liquibase 变更日志?

问题描述 投票:0回答:1

我正在使用 Quarkus 开发 Java 应用程序,并尝试从我的 JPA 实体生成 Liquibase 变更日志文件。此前,我已成功使用 Liquibase Hibernate 扩展 与 Kotlin 和 Spring Boot 来实现这一目标。以下是我使用 Spring Boot 所做的简要概述:

  1. 向我的项目添加了 Liquibase Core 和 Liquibase Hibernate 6 扩展。
  2. 在我的 build.gradle.kts 中配置 Liquibase(URL、数据库用户和密码,...)。
  3. 使用 diff 命令生成一个新的变更日志文件,其中包含我的实体和引用的数据库之间的差异。

如何在 Quarkus 应用程序中实现类似的功能?

这是我迄今为止在 Quarkus 项目中所做的事情:

  1. 项目设置:

    • 创建了一个新的 Quarkus 项目。
    • 在pom.xml中添加了以下依赖项:
    <dependencies>
      ...
      <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-hibernate-orm-panache</artifactId>
        <version>${quarkus.platform.version}</version>
      </dependency>
      <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-liquibase</artifactId>
        <version>${quarkus.platform.version}</version>
      </dependency>
      <dependency>
        <groupId>org.liquibase.ext</groupId>
        <artifactId>liquibase-hibernate6</artifactId>
        <version>4.28.0</version>
      </dependency>
    </dependencies>
    
    • 添加并配置 Liquibase Maven 插件:
    <plugins>
      ...
      <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>4.28.0</version>
        <configuration>
          <driver>oracle.jdbc.driver.OracleDriver</driver>
          <url>jdbc:oracle:thin:@//localhost:1521/ORCLCDB</url>
          <changeLogFile>src/main/resources/db/db.changelog-master.yaml</changeLogFile>
          <username>foo</username>
          <password>bar</password>
          <referenceUrl>hibernate:spring:com.example.myapplication?dialect=org.hibernate.dialect.PostgreSQLDialect&</referenceUrl>
        </configuration>
      </plugin>
    </plugins>
    

    注意:我知道我正在使用 Hibernate Spring 连接 URL,但我不知道应该使用哪个其他 Hibernate URL。

  2. Liquibase 配置:

    quarkus.datasource.db-kind=oracle
    quarkus.datasource.jdbc.url=${DB_HOST:jdbc:oracle:thin:@//localhost:1521/ORCLCDB}
    quarkus.datasource.username=${DB_USER:foo}
    quarkus.datasource.password=${DB_PASSWORD:bar}
    quarkus.hibernate-orm.database.generation=none
    quarkus.liquibase.migrate-at-start=true
    
  3. 定义了我的 JPA 实体。例如:

    package com.example.foo.repository;
    
    ...
    
    @Entity
    public class Person {
        @Id
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private Long id;
        private String name;
    
        // Getters and setters
    }
    

但是,我还没有找到从 Quarkus 生态系统中的 JPA 实体生成 Liquibase 变更日志文件的方法,就像我在 Spring Boot 中所做的那样。

有没有办法使用 Liquibase Hibernate 扩展从 Quarkus 中的 JPA 实体生成 Liquibase 变更日志文件,或者是否有我应该考虑的替代方法?

java hibernate quarkus database-migration liquibase
1个回答
0
投票

没有直接的方法可以做到这一点,但答案是这很棘手,但你可以实现它。它不是很简洁,但接近一个可行的解决方案。

您还可以查看Quarkus Github中的某些讨论以及Liquibase-hibernate问题这里这里

在我的生态系统中,我使用 gradle。

configurations {
    compileOnly {
        extendsFrom annotationProcessor
    }
    liquibase
    liquibaseRuntime.extendsFrom runtime
}

ext {
    diffChangeLogVersion = "CHANGE-0002"
    rollbackTagVersion = "CHANGE-0002"
    diffChangeLogFile = "src/main/resources/XXXX/db-changelog-${diffChangeLogVersion}.oracle.sql"
    entitiesPackage =  XXX.XXX.XXX.XXX"
    hibernateGenericDialect = "org.hibernate.dialect.OracleDialect"
    springCoreVersion = "6.1.2"
    springDataVersion = "3.2.1"
}

dependencies {
    // Liquibase
    implementation "io.quarkus:quarkus-liquibase"
    liquibaseRuntime "org.liquibase.ext:liquibase-hibernate6:4.30.0"
    //liquibaseRuntime "org.liquibase:liquibase-groovy-dsl:3.0.2"
    liquibaseRuntime "info.picocli:picocli:4.7.5"
    liquibaseRuntime "com.oracle.database.jdbc:ojdbc11-production:23.2.0.0"
    liquibaseRuntime "javax.xml.bind:jaxb-api:2.3.1"
    liquibaseRuntime "ch.qos.logback:logback-core:1.2.9"
    liquibaseRuntime "ch.qos.logback:logback-classic:1.2.9"

    liquibaseRuntime "org.springframework:spring-core:${springCoreVersion}"
    liquibaseRuntime "org.springframework.data:spring-data-jpa:${springDataVersion}"
    liquibaseRuntime "org.springframework.data:spring-data-envers:${springDataVersion}"
    liquibaseRuntime sourceSets.main.output
}

task deleteDiffChangeLog(type: Delete) {
    delete diffChangeLogFile
}

task liquibaseEntitiesToDbDiffChangelog(type: JavaExec) {
    dependsOn deleteDiffChangeLog
    group = "liquibase"
    classpath sourceSets.main.runtimeClasspath
    classpath configurations.liquibaseRuntime
    mainClass = "liquibase.integration.commandline.LiquibaseCommandLine"
    args "--logLevel=FINE"
    args "--changeLogFile=${diffChangeLogFile}"
    args "--url=${dbURL}"
    args "--username=${dbUser}"
    args "--password=${dbPassword}"
    args "--defaultSchemaName=${dbSchema}"
    args "--driver=${dbDriver}"
    args "--referenceUrl=hibernate:spring:${entitiesPackage}?dialect=${hibernateGenericDialect}"
    args "diffChangeLog"
}
© www.soinside.com 2019 - 2024. All rights reserved.