忽略Liquibase差异中的项目

时间:2014-12-24 12:16:57

标签: liquibase

我们有一个内部工具,可以将Hibernate的应用程序视图与管理数据库的Liquibase更改日志进行比较。这是使用Liquibase 3.3.1,它发现了Liquibase 2.x没有看到的数据库差异,我们宁愿忽略它。我们已经忽略了比较中的所有观点:

    CompareControl control = new CompareControl();
    control.getComparedTypes().remove(View.class);
    DiffResult result = liquibase.diff(reference, target, control);
    DiffOutputControl output = new DiffOutputControl(false, false, false);
    DiffToChangeLog changeLog = new DiffToChangeLog(result, output);

我们要忽略的其他比较是:

默认值。在向数据库添加列时,我们使用Hibernate不知道的默认值:

<changeSet author="adrian (generated)" id="1419421913188-163">
    <dropDefaultValue columnDataType="timestamp(29,6)" columnName="timestamp" tableName="transportjob"/>
</changeSet>

外键约束。我们将一些外键约束更改为CASCADE。 (这与Liquibase Diff Tool missing constraints)完全相反。

<changeSet author="adrian (generated)" id="1419421913188-90">
    <dropForeignKeyConstraint baseTableName="site" constraintName="fk_rpietmexbx0ywmlywidira71h"/>
    <addForeignKeyConstraint baseColumnNames="logo_id" baseTableName="site" constraintName="fk_rpietmexbx0ywmlywidira71h" referencedColumnNames="id" referencedTableName="image"/>
</changeSet>

2 个答案:

答案 0 :(得分:1)

此答案仅适用于默认值。即使在liquibase 3.3.2中修复CORE-875:Ignore tables for diffs and generateChangelog之后,似乎也无法过滤默认值(或者我无法做到这一点)。 所以我已经过滤了DiffResult以删除&#34;默认值&#34;差异,在使用DiffToChangeLog之前。

   final DiffResult diffResult = liquibase.diff(reference, target, control);
   Map<DatabaseObject, ObjectDifferences> changedObjects = diffResult.getChangedObjects();
   for (DatabaseObject changedDbObject : changedObjects.keySet()) {
      ObjectDifferences objectDifferences = changedObjects.get(changedDbObject);
      if (objectDifferences.removeDifference("defaultValue")){
        logger.info("Ignoring default value for {}",changedDbObject.toString());
      }
      if (!objectDifferences.hasDifferences()){
        logger.info("removing {}, no difference left.",changedDbObject.toString());
        changedObjects.remove(objectDifferences);
      }
   }

另一种解决方案是使用hibernate @ColumnDefault(),但似乎对Embedded对象有一些限制。

答案 1 :(得分:0)

目前没有对它的支持,但这是我计划今天看的东西。当功能可用时,请关注https://liquibase.jira.com/browse/CORE-875