2121import liquibase .change .ColumnConfig ;
2222import liquibase .change .ConstraintsConfig ;
2323import liquibase .change .core .AddColumnChange ;
24+ import liquibase .change .core .AddForeignKeyConstraintChange ;
2425import liquibase .change .core .CreateTableChange ;
2526import liquibase .change .core .DropColumnChange ;
27+ import liquibase .change .core .DropForeignKeyConstraintChange ;
2628import liquibase .change .core .DropTableChange ;
2729import liquibase .changelog .ChangeLogChild ;
2830import liquibase .changelog .ChangeLogParameters ;
5254import java .util .Set ;
5355import java .util .function .BiPredicate ;
5456import java .util .function .Predicate ;
57+ import java .util .stream .Collectors ;
5558
5659import org .springframework .core .io .Resource ;
5760import org .springframework .data .mapping .context .MappingContext ;
@@ -321,15 +324,15 @@ private ChangeSet createChangeSet(ChangeSetMetadata metadata, SchemaDiff differe
321324 private SchemaDiff initial () {
322325
323326 Tables mappedEntities = Tables .from (mappingContext .getPersistentEntities ().stream ().filter (schemaFilter ),
324- sqlTypeMapping , null );
327+ sqlTypeMapping , null , mappingContext );
325328 return SchemaDiff .diff (mappedEntities , Tables .empty (), nameComparator );
326329 }
327330
328331 private SchemaDiff differenceOf (Database database ) throws LiquibaseException {
329332
330333 Tables existingTables = getLiquibaseModel (database );
331334 Tables mappedEntities = Tables .from (mappingContext .getPersistentEntities ().stream ().filter (schemaFilter ),
332- sqlTypeMapping , database .getDefaultCatalogName ());
335+ sqlTypeMapping , database .getDefaultCatalogName (), mappingContext );
333336
334337 return SchemaDiff .diff (mappedEntities , existingTables , nameComparator );
335338 }
@@ -362,6 +365,13 @@ private DatabaseChangeLog getDatabaseChangeLog(File changeLogFile, @Nullable Dat
362365
363366 private void generateTableAdditionsDeletions (ChangeSet changeSet , SchemaDiff difference ) {
364367
368+ for (Table table : difference .tableDeletions ()) {
369+ for (ForeignKey foreignKey : table .foreignKeys ()) {
370+ DropForeignKeyConstraintChange dropForeignKey = dropForeignKey (foreignKey );
371+ changeSet .addChange (dropForeignKey );
372+ }
373+ }
374+
365375 for (Table table : difference .tableAdditions ()) {
366376 CreateTableChange newTable = changeTable (table );
367377 changeSet .addChange (newTable );
@@ -373,12 +383,24 @@ private void generateTableAdditionsDeletions(ChangeSet changeSet, SchemaDiff dif
373383 changeSet .addChange (dropTable (table ));
374384 }
375385 }
386+
387+ for (Table table : difference .tableAdditions ()) {
388+ for (ForeignKey foreignKey : table .foreignKeys ()) {
389+ AddForeignKeyConstraintChange addForeignKey = addForeignKey (foreignKey );
390+ changeSet .addChange (addForeignKey );
391+ }
392+ }
376393 }
377394
378395 private void generateTableModifications (ChangeSet changeSet , SchemaDiff difference ) {
379396
380397 for (TableDiff table : difference .tableDiffs ()) {
381398
399+ for (ForeignKey foreignKey : table .fkToDrop ()) {
400+ DropForeignKeyConstraintChange dropForeignKey = dropForeignKey (foreignKey );
401+ changeSet .addChange (dropForeignKey );
402+ }
403+
382404 if (!table .columnsToAdd ().isEmpty ()) {
383405 changeSet .addChange (addColumns (table ));
384406 }
@@ -388,6 +410,11 @@ private void generateTableModifications(ChangeSet changeSet, SchemaDiff differen
388410 if (!deletedColumns .isEmpty ()) {
389411 changeSet .addChange (dropColumns (table , deletedColumns ));
390412 }
413+
414+ for (ForeignKey foreignKey : table .fkToAdd ()) {
415+ AddForeignKeyConstraintChange addForeignKey = addForeignKey (foreignKey );
416+ changeSet .addChange (addForeignKey );
417+ }
391418 }
392419 }
393420
@@ -444,12 +471,27 @@ private Tables getLiquibaseModel(Database targetDatabase) throws LiquibaseExcept
444471 tableModel .columns ().add (columnModel );
445472 }
446473
474+ tableModel .foreignKeys ().addAll (extractForeignKeys (table ));
475+
447476 existingTables .add (tableModel );
448477 }
449478
450479 return new Tables (existingTables );
451480 }
452481
482+ private static List <ForeignKey > extractForeignKeys (liquibase .structure .core .Table table ) {
483+
484+ return table .getOutgoingForeignKeys ().stream ().map (foreignKey -> {
485+ String tableName = foreignKey .getForeignKeyTable ().getName ();
486+ List <String > columnNames = foreignKey .getForeignKeyColumns ().stream ()
487+ .map (liquibase .structure .core .Column ::getName ).toList ();
488+ String referencedTableName = foreignKey .getPrimaryKeyTable ().getName ();
489+ List <String > referencedColumnNames = foreignKey .getPrimaryKeyColumns ().stream ()
490+ .map (liquibase .structure .core .Column ::getName ).toList ();
491+ return new ForeignKey (foreignKey .getName (), tableName , columnNames , referencedTableName , referencedColumnNames );
492+ }).collect (Collectors .toList ());
493+ }
494+
453495 private static AddColumnChange addColumns (TableDiff table ) {
454496
455497 AddColumnChange addColumnChange = new AddColumnChange ();
@@ -532,6 +574,25 @@ private static DropTableChange dropTable(Table table) {
532574 return change ;
533575 }
534576
577+ private static AddForeignKeyConstraintChange addForeignKey (ForeignKey foreignKey ) {
578+
579+ AddForeignKeyConstraintChange change = new AddForeignKeyConstraintChange ();
580+ change .setConstraintName (foreignKey .name ());
581+ change .setBaseTableName (foreignKey .tableName ());
582+ change .setBaseColumnNames (String .join ("," , foreignKey .columnNames ()));
583+ change .setReferencedTableName (foreignKey .referencedTableName ());
584+ change .setReferencedColumnNames (String .join ("," , foreignKey .referencedColumnNames ()));
585+ return change ;
586+ }
587+
588+ private static DropForeignKeyConstraintChange dropForeignKey (ForeignKey foreignKey ) {
589+
590+ DropForeignKeyConstraintChange change = new DropForeignKeyConstraintChange ();
591+ change .setConstraintName (foreignKey .name ());
592+ change .setBaseTableName (foreignKey .tableName ());
593+ return change ;
594+ }
595+
535596 /**
536597 * Metadata for a ChangeSet.
537598 */
0 commit comments