web-dev-qa-db-ja.com

エンティティの変更後のjhipsterliquibase検証エラー

エンティティに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の私の問題は誰か教えてもらえますか?

6
krypto88

Liquibaseを使用する場合、後で発生するすべてのエンティティの変更は、個別の変更ログとしてキャプチャする必要があります(たとえば、新しい列を追加するなどのテーブルの変更)。 Jhipster cliは常に、対応するliquibaseファイル(通常はパターン_'config/liquibase/changelog/20180607110114_added_entity_Employee.xml'_)に対応するエンティティ(変更された方)を上書きするようです。したがって、エンティティliquibaseファイルのチェックサムは、新しいコンテンツが含まれるようになったため変更されます。また、データベースには、適用されたすべてのchangeLogを格納するDATABASECHANGELOGというテーブルがあり、これにはチェックサムデータが含まれています。

これで、アプリケーションを起動すると、変更されたエンティティのチェックサムの最新のliquibase changeLogが前回実行したときとは異なるため、エラーが発生します(データベースには前のバージョンのこのliquibaseファイルのチェックサムがあります)。

_mvn liquibase:clearCheckSums_は、必要な場合を除いて、ほとんどの場合、適切なアプローチではありません。これにより、データベース内のすべてのチェックサムが実際にクリアされます。通常は意図されていない、発生した変更を追跡できなくなります。 liquibaseのこれらの機能は、たとえば、適用した新しい変更をロールバックする場合などに意味があります。チェックサムをクリアしてアプリケーションを実行すると、新しいチェックサムが計算され、トラックを失い、十分な注意が払われていないと問題が発生する可能性があります。

適切な解決策:

  1. Jhipster _entity sub-generator_または_jdl import_または_manual 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はすべてのchangeLogでこのファイルを参照するため、マスターファイルに追加する必要があります。
  6. ここでアプリケーションを実行し、changeLogsが適用されていない場合、liquibaseはこれらの新しい変更をデータベースに適用しようとします。

要約すると、jhipstercliはエンティティのliquibaseファイルを上書きします。以前に生成されたliquibaseファイルを上書きする代わりに、それらを元に戻し、_mvn liquibase:diff_を実行して、エンティティへの新しい変更を新しいchangeLogにキャプチャします。チェックサムエラーが解決され、データベースの変更もliquibaseにキャプチャされていることがわかります。

参照:
- liquibaseおよびJhipsterデータベースの更新を処理する方法。 _Database updates_で見出しを確認してください

13
prem kumar

DBで次のクエリを実行してみてください。UPDATEDATABASECHANGELOGSETMD5SUM = null WHERE ID = 'YOUR TABLE ID';

この場合のテーブルIDは= 20170221193921-1のようです。

3
Wahab Hassan

コマンドjhpster entity xxxxを使用してJhipsterに列を追加すると、個別のチェンジセットとして追加されません。代わりに、テーブルを作成するための既存の変更セットに列が追加され、ファイルに変更があると、新しいチェックサムが生成されます。起動時にはDBとは異なるため、検証は失敗します

<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

1
faizal khan