修改实体

时间:2017-04-04 12:23:27

标签: spring spring-boot h2 jhipster

我试图将一个字段添加到我的实体作为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的问题是什么吗?

4 个答案:

答案 0 :(得分:7)

当我们使用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. 如果您现在运行该应用程序,如果未应用changeLogs,则liquibase将尝试在数据库上应用这些新更改。
  7. 总结一下,jhipster cli会覆盖实体liquibase文件。还原它们并运行mvn liquibase:diff以捕获新changeLog中对entites的新更改,而不是覆盖先前生成的liquibase文件。我们可以看到解决了校验和错误,并且还在liquibase中捕获了数据库更改。

    <强>参考文献:
      - How to deal with liquibase and Jhipster database updates. 检查标题为Database updates

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

when we add a column in Jhipster using the command jhpster entity xxxx.
It is not added as a seperate changeset ,instead the column is added in the existing change set for create table and as there is a change in the file new checksum is generated and on startup it is different from the DB.so validation fails
<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>
To fix this issue add a new changeset with add column as tag ..shown below
<changeSet id="20181209164925-2" author="jhipster" runOnChange="true">      
      <addColumn tableName="xxxxxx">
         <column name="xxxxxx" type="date"></column>
      </addColumn>

Refer https://www.liquibase.org/documentation/changes/add_column.html

答案 3 :(得分:0)

快速解决方案是运行:

./mvnw clean
./mvnw liquibase:clearCheckSums

这将起作用,但是您缺少使用Liquibase跟踪更改的意义。出于开发目的,没关系。

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