我正在使用 Quarkus 开发 Java 应用程序,并尝试从我的 JPA 实体生成 Liquibase 变更日志文件。此前,我已成功使用 Liquibase Hibernate 扩展 与 Kotlin 和 Spring Boot 来实现这一目标。以下是我使用 Spring Boot 所做的简要概述:
如何在 Quarkus 应用程序中实现类似的功能?
这是我迄今为止在 Quarkus 项目中所做的事情:
项目设置:
<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>
<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。
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
定义了我的 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 变更日志文件,或者是否有我应该考虑的替代方法?
没有直接的方法可以做到这一点,但答案是这很棘手,但你可以实现它。它不是很简洁,但接近一个可行的解决方案。
您还可以查看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"
}