2014-12-24 46 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後,似乎也無法過濾默認值(或者我無法做到這一點)。 所以我在使用DiffToChangeLog之前過濾了DiffResult以刪除「默認值」差異。

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(),但它似乎對嵌入式對象有一些限制。