【问题标题】:jhipster liquibase validation error after modify entity修改实体后 jhipster liquibase 验证错误
【发布时间】:2017-08-29 15:35:39
【问题描述】:

我试图将一个字段作为 CLOB 添加到我的实体中。使用 JHipster CLI 时,添加它没有问题。

现在,当我尝试启动我的应用程序时,我从 liquibase 收到以下验证错误:

liquibase.exception.ValidationFailedException: Validation Failed:
     1 change sets check sum
          config/liquibase/changelog/20170221193921_xxxxxxxx.xml::20170221193921-1::jhipster was: 7:d8b3f42d8d4d523c7b14f93b4c7657c7 but is now: 7:a2a365179a0d231c2771ebd79f51b1fc

我还尝试了以下方法:

./mvnw liquibase:clearCheckSums

结果是BUILD SUCCESS

我也试过 ./mvnw liquibase:update 和 updateSQL,结果一样。

谁能告诉我 JHipster 有什么问题?

【问题讨论】:

  • 您不应更新已执行的changeset,而必须创建另一个,或者只是简单地擦除您的数据库并从头开始重新创建。
  • 面临同样的问题,不确定什么是正确的方法?你找到解决办法了吗
  • 除了 Anton 的评论:磁盘持久 h2 db 可以通过在 application.yml 中设置 spring.liquibase.drop-first: true 从头开始​​重新创建
  • liquibase:clearCheckSums 帮助了我。谢谢

标签: spring spring-boot h2 jhipster


【解决方案1】:

快速解决方案是运行:

./mvnw clean
./mvnw liquibase:clearCheckSums

这将起作用,但是您错过了使用 Liquibase 跟踪更改的要点。出于开发目的,没关系。

解决此问题的正确方法是运行./mvnw liquibaseDiffChangeLog 以创建对数据库所做更改的差异更改日志。然后可以将其作为新条目添加到 master.xml 文件中,下次启动应用时可以应用该条目。

【讨论】:

    【解决方案2】:

    当我们使用命令jhpster entity xxxx 在 Jhipster 中添加一列时,它不会作为单独的变更集添加,而是将该列添加到现有变更集中以用于创建表,并且由于文件中存在更改,因此新校验和是生成并在启动时与数据库不同,因此验证失败

    <changeSet id="20181209164925-1" author="jhipster" >    
        <createTable tableName="xxxxxx">
            <column name="id" type="bigint" autoIncrement="${autoIncrement}">
                <constraints primaryKey="true" nullable="false"/>
            </column>
            <column name="xxxxx" type="integer">
    
                <constraints nullable="true" />
            </column>
            <column name="xxxxx" type="integer">
                <constraints nullable="true" />
            </column>
            <column name="xxxxxx" type="varchar(140)">
                <constraints nullable="true" />
            </column> 
            <column name="xxxx" type="bigint">
                <constraints nullable="true" />
            </column>
            <!-- jhipster-needle-liquibase-add-column - JHipster will add columns here, do not remove-->
        </createTable>
    

    要解决此问题,请添加一个新的变更集,其中添加列作为标记 .. 如下所示

    <changeSet id="20181209164925-2" author="jhipster" runOnChange="true">      
        <addColumn tableName="xxxxxx">
             <column name="xxxxxx" type="date"></column>
        </addColumn>
    

    参考https://www.liquibase.org/documentation/changes/add_column.html

    【讨论】:

      【解决方案3】:

      当我们使用 liquibase 时,以后发生的所有实体更改都应该被捕获为单独的更改日志(例如,像添加新列一样更改表)。 Jhipster cli 似乎总是覆盖实体(以更改为准)对应的 liquibase 文件(通常是模式'config/liquibase/changelog/20180607110114_added_entity_Employee.xml')。因此,实体 liquibase 文件的校验和会发生变化,因为它现在具有新内容。在您的数据库中,有一个名为 DATABASECHANGELOG 的表存储了所有已应用的更改日志,并且其中包含校验和数据。

      现在,当您启动应用程序时,您将收到错误消息,因为您最近一次运行的已修改实体校验和的 liquibase changeLog 与您上次运行的不同(数据库将为此 liquibase 文件提供以前版本的校验和)。

      mvn liquibase:clearCheckSums 在大多数情况下不是正确的方法,除非需要。这实际上清除了数据库中的所有校验和。您忘记了已经发生的通常不是有意的更改。 liquibase 的这些特性很有意义,例如当您想要回滚已应用的新更改时。如果您清除校验和并运行该应用程序,它将计算新的校验和,您会迷失方向,如果没有给予足够的关注,可能会给您带来麻烦。

      正确的解决方案:

      1. 使用 jhipster entity sub-generatorjdl importmanual changes to your entities directly 更改您的实体。
      2. 现在检查实体对应的 liquibase 文件是否已更改。通常名称包含 '.._added_entity_...' 。例如。 'config/liquibase/changelog/20180607110114_added_entity_Employee.xml'
      3. 将该文件恢复到原来的状态,以防它被覆盖。 Git 在此处有助于还原。
      4. 如果您现在启动应用程序,您将不会收到验证校验和错误,因为文件的校验和匹配。
      5. 但我们对实体所做的更改并未在 liquibase 中捕获。为此,您必须运行 mvn liquibase:diff。这将生成一个 changeLog 文件。手动检查一次并将其添加到 liquibase 的 master.xml 文件中。添加到主文件是必须的,因为 liquibase 是指所有 changeLogs 的此文件。
      6. 如果您现在运行应用程序,如果没有应用更改日志,那么 liquibase 将尝试在数据库上应用这些新更改。

      总而言之,jhipster cli 会覆盖实体 liquibase 文件。还原它们并运行 mvn liquibase:diff 以在新的 changeLog 中捕获对实体的新更改,而不是覆盖先前生成的 liquibase 文件。我们可以看到校验和错误已解决,并且在 liquibase 中也捕获了数据库更改。

      参考资料:
      - How to deal with liquibase and Jhipster database updates.Database updates检查标题

      【讨论】:

      • 是的,这解决了实体问题,但我仍然遇到开发环境的数据问题,在还原假数据 csv 后,这个问题也正在解决。
      【解决方案4】:

      尝试在您的数据库中执行以下查询: UPDATE DATABASECHANGELOG SET MD5SUM = null WHERE ID='您的表 ID';

      在这种情况下,您的 TABLE ID 似乎是 = 20170221193921-1。

      【讨论】:

      • 这是一种不好的方法,也不是liquibase 的方法,请阅读数据库迁移的概念。
      • 同意,liquibase 方式 是通过liquibase:clearCheckSums 清除校验和,因此 liquibase 将在下次运行时重新计算它们,但在使用吉普斯特。这是我遇到的一项工作。
      • 我有类似的情况 @krypto88.liquibase:clearCheckSums 无法清除 liquibase.exception.ValidationFailedException: Validation Failed。那么如何摆脱呢?
      • @Cristian 你试过答案中的解决方案了吗?
      • 这确实解决了错误,但它不会重新生成数据库,除非您使用内存数据库。因此,任何引用更改/添加字段之一的查询都将失败。通过在application.yml 中设置spring.liquibase.drop-first: true 可以重新创建磁盘持久数据库
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-11
      • 1970-01-01
      • 2019-09-13
      • 2022-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多