2014-12-24 3 views
0

У нас есть собственный инструмент, который сравнивает представление Hibernate нашего приложения с журналом изменений Liquibase, который управляет базой данных. Это использует Liquibase 3.3.1, который обнаружил разницу в базе данных, которую Liquibase 2.x не видел, и которую мы предпочли бы игнорировать. Мы уже игнорировать все виды в сравнении:Игнорировать элементы в Liquibase diff

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> 

ответ

1

этот ответ применяется только к значению по умолчанию. Даже после того, как CORE-875:Ignore tables for diffs and generateChangelog исправить в Liquibase 3.3.2, кажется невозможным отфильтровать значение по умолчанию (или я не смог это сделать). Итак, я отфильтровал DiffResult, чтобы удалить разницу по умолчанию, прежде чем использовать 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); 
     } 
    } 

Другим решением является использование спящего режима @ColumnDefault(), но это, кажется, есть некоторые ограничения, с внедренным объектом.

Смежные вопросы