diff --git a/src/main/java/liquibase/ext/hibernate/diff/ChangedPrimaryKeyChangeGenerator.java b/src/main/java/liquibase/ext/hibernate/diff/ChangedPrimaryKeyChangeGenerator.java new file mode 100644 index 00000000..22787266 --- /dev/null +++ b/src/main/java/liquibase/ext/hibernate/diff/ChangedPrimaryKeyChangeGenerator.java @@ -0,0 +1,37 @@ +package liquibase.ext.hibernate.diff; + +import liquibase.change.Change; +import liquibase.database.Database; +import liquibase.diff.ObjectDifferences; +import liquibase.diff.output.DiffOutputControl; +import liquibase.diff.output.changelog.ChangeGeneratorChain; +import liquibase.ext.hibernate.database.HibernateDatabase; +import liquibase.structure.DatabaseObject; +import liquibase.structure.core.PrimaryKey; + +/** + * Hibernate doesn't know about all the variations that occur with primary keys, especially backing index stuff. + * To prevent changing customized primary keys, we suppress this kind of changes from hibernate side. + */ +public class ChangedPrimaryKeyChangeGenerator extends liquibase.diff.output.changelog.core.ChangedPrimaryKeyChangeGenerator { + + @Override + public int getPriority(Class objectType, Database database) { + if (PrimaryKey.class.isAssignableFrom(objectType)) { + return PRIORITY_ADDITIONAL; + } + return PRIORITY_NONE; + } + + @Override + public Change[] fixChanged(DatabaseObject changedObject, ObjectDifferences differences, DiffOutputControl control, Database referenceDatabase, Database comparisonDatabase, ChangeGeneratorChain chain) { + if (referenceDatabase instanceof HibernateDatabase || comparisonDatabase instanceof HibernateDatabase) { + differences.removeDifference("unique"); + if (!differences.hasDifferences()) { + return null; + } + } + + return super.fixChanged(changedObject, differences, control, referenceDatabase, comparisonDatabase, chain); + } +} diff --git a/src/main/java/liquibase/ext/hibernate/diff/ChangedUniqueConstraintChangeGenerator.java b/src/main/java/liquibase/ext/hibernate/diff/ChangedUniqueConstraintChangeGenerator.java index 3a0f9aac..204c12b2 100644 --- a/src/main/java/liquibase/ext/hibernate/diff/ChangedUniqueConstraintChangeGenerator.java +++ b/src/main/java/liquibase/ext/hibernate/diff/ChangedUniqueConstraintChangeGenerator.java @@ -9,6 +9,11 @@ import liquibase.structure.DatabaseObject; import liquibase.structure.core.UniqueConstraint; +/** + * Unique attribute for unique constraints backing index can have different values dependending on the database implementation, + * so we suppress all unique constraint changes based on unique constraints. + + */ public class ChangedUniqueConstraintChangeGenerator extends liquibase.diff.output.changelog.core.ChangedUniqueConstraintChangeGenerator { @Override diff --git a/src/main/resources/META-INF/services/liquibase.diff.output.changelog.ChangeGenerator b/src/main/resources/META-INF/services/liquibase.diff.output.changelog.ChangeGenerator index c6497670..7025ee17 100644 --- a/src/main/resources/META-INF/services/liquibase.diff.output.changelog.ChangeGenerator +++ b/src/main/resources/META-INF/services/liquibase.diff.output.changelog.ChangeGenerator @@ -1,5 +1,6 @@ liquibase.ext.hibernate.diff.ChangedColumnChangeGenerator liquibase.ext.hibernate.diff.ChangedForeignKeyChangeGenerator +liquibase.ext.hibernate.diff.ChangedPrimaryKeyChangeGenerator liquibase.ext.hibernate.diff.ChangedSequenceChangeGenerator liquibase.ext.hibernate.diff.ChangedUniqueConstraintChangeGenerator liquibase.ext.hibernate.diff.MissingSequenceChangeGenerator