【问题标题】:Generate Changelog with Liquibase and JPA Entities使用 Liquibase 和 JPA 实体生成变更日志
【发布时间】:2019-04-28 17:28:26
【问题描述】:

我想在我的项目中引入 liquibase,首先我想根据我的休眠实体生成一个变更日志文件。

到目前为止我所拥有的:

application.properties

# HIBERNATE
# Write out schema into sql script
spring.jpa.properties.javax.persistence.schema-generation.scripts.create-target=target/schema-h2.sql
spring.jpa.properties.javax.persistence.schema-generation.scripts.action=create
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.H2Dialect

# DATABASE
spring.datasource.platform=h2
spring.datasource.driver-class-name=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=
spring.h2.console.enabled=true

# LIQUIBASE
spring.liquibase.enabled=true
spring.liquibase.url=jdbc:h2:mem:testdb
spring.liquibase.user=sa
spring.liquibase.password=
spring.liquibase.changeLog=classpath:/db/h2/liquibase-changelog-master.xml

pom.xml

<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
    <groupId>org.liquibase</groupId>
    <artifactId>liquibase-maven-plugin</artifactId>
    <version>${liquibase.version}</version>
</dependency>

...

<plugins>
    <plugin>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-maven-plugin</artifactId>
        <version>${liquibase.version}</version>
        <configuration>                  
            <changeLogFile>s/m/r/db/h2/liquibase-changelog-master.xml</changeLogFile>
            <diffChangeLogFile> s/m/r/db/h2/changelog/${timestamp}_changelog.xml</diffChangeLogFile>
            <outputChangeLogFile> s/m/r/db/h2/changelog/myaddon.db.changelog.xml</outputChangeLogFile>
            <driver>org.h2.Driver</driver>
            <url>jdbc:h2:mem:testdb</url>
            <username>sa</username>
            <password></password>
            <referenceUrl>hibernate:spring:ch.hemisoft.immo.domain?hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy</referenceUrl>
            <verbose>true</verbose>
            <logging>trace</logging>
        </configuration>
        <dependencies>
            <dependency>
               <groupId>org.liquibase.ext</groupId>
               <artifactId>liquibase-hibernate5</artifactId>
               <version>${liquibase-hibernate5.version}</version>
            </dependency>
            <dependency>
               <groupId>org.liquibase</groupId>
               <artifactId>liquibase-core</artifactId>
               <version>${liquibase.version}</version>
            </dependency>
            <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-beans</artifactId>
               <version>${spring.version}</version>
            </dependency>
            <dependency>
               <groupId>org.springframework</groupId>
               <artifactId>spring-core</artifactId>
               <version>${spring.version}</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
                <version>2.1.4.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>javax.validation</groupId>
                <artifactId>validation-api</artifactId>
                <version>${validation-api.version}</version>
            </dependency>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>${h2.version}</version>
            </dependency>
            <dependency>
               <groupId>org.javassist</groupId>
               <artifactId>javassist</artifactId>
               <version>${javassist.version}</version>
            </dependency>
        </dependencies>            
    </plugin> 
</plugins>

当尝试使用mvn liquibase:generateChangeLog 生成更改日志文件时,我会得到如下信息:

// A big list of artifacts ...

[INFO] Starte Liquibase am So, 28 Apr 2019 19:09:24 MESZ (Version 3.6.3, kompiliert am 2019-01-29 11:34:48)
[INFO] Settings
----------------------------
[INFO]     driver: org.h2.Driver
[INFO]     url: jdbc:h2:mem:testdb
[INFO]     username: sa
[INFO]     password: *****
[INFO]     use empty password: false
[INFO]     properties file: null
[INFO]     properties file will override? false
[INFO]     prompt on non-local database? true
[INFO]     clear checksums? false
[INFO]     defaultSchemaName: null
[INFO]     diffTypes: null
[INFO]     dataDir: null
[INFO] ------------------------------------------------------------------------
[INFO] Executing on Database: jdbc:h2:mem:testdb
[INFO] Loading artifacts into URLClassLoader

// A big list of artifacts ...

[INFO] Generating Change Log from database SA @ jdbc:h2:mem:testdb (Default Schema: PUBLIC)
[INFO] SELECT SEQUENCE_NAME FROM INFORMATION_SCHEMA.SEQUENCES WHERE SEQUENCE_SCHEMA = 'PUBLIC' AND IS_GENERATED=FALSE
[INFO] src\main\resources\db\h2\changelog\myaddon.db.changelog.xml exists, appending
[INFO] No changes found, nothing to do
[INFO] Output written to Change Log file, src/main/resources/db/h2/changelog/myaddon.db.changelog.xml
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  4.161 s
[INFO] Finished at: 2019-04-28T19:09:26+02:00
[INFO] ------------------------------------------------------------------------

如您所见,上面写着No changes found, nothing to do,但我希望我的第一个更改日志包含初始表创建。

我还看到,它似乎试图从空数据库而不是从休眠类创建更改日志文件:

Generating Change Log from database SA @ jdbc:h2:mem:testdb (Default Schema: PUBLIC)

输出文件myaddon.db.changelog.xml 如下所示:

<?xml version="1.1" encoding="UTF-8" standalone="no"?>
<databaseChangeLog
    xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
    xmlns:ext="http://www.liquibase.org/xml/ns/dbchangelog-ext"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog-ext http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-ext.xsd http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd" />

感谢您的帮助。

【问题讨论】:

  • 嗯,URL 是 jdbc:h2:mem:testdb,所以它是一个内存数据库,不是吗?那为什么里面会有东西呢? h2database.com/html/features.html#in_memory_databases
  • referenceUrl 是hibernate:spring:ch.hemisoft.immo.domain?...,我希望它看到空数据库和休眠实体之间的区别,并根据休眠实体更新空数据库。我想要一个基于休眠的“主”变更日志。

标签: spring-boot jpa liquibase changelog


【解决方案1】:

如果你想从你的休眠实体开始生成更新日志,你可以使用

mvn liquibase:diff

首先你需要将方言添加到你的referenceUrl(你的配置中缺少)

<referenceUrl>hibernate:spring:ch.hemisoft.immo.domain?hibernate.physical_naming_strategy=org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy&amp;dialect=org.hibernate.dialect.H2Dialect</referenceUrl>

【讨论】:

  • 我收到“[错误] 设置或运行 Liquibase 时出错:[错误] liquibase.exception.DatabaseException: java.lang.RuntimeException: 找不到数据库驱动程序:未指定驱动程序类,无法使用从 url 确定 (hibernate:spring:com.obunda.cms.domain?dialect=org.hibernate.dialect.PostgreSQLDialect)"
猜你喜欢
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 2019-03-30
  • 2013-09-29
  • 1970-01-01
相关资源
最近更新 更多