我们有一个内部工具,可以将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>
答案 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。