diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaMigratorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaMigratorImpl.java index 5e6029191d..745d18d511 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaMigratorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaMigratorImpl.java @@ -13,6 +13,7 @@ import java.util.Set; import org.hibernate.boot.Metadata; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.Exportable; import org.hibernate.boot.model.relational.Namespace; @@ -72,6 +73,38 @@ public class SchemaMigratorImpl implements SchemaMigrator { final Set exportIdentifiers = new HashSet( 50 ); final Database database = metadata.getDatabase(); + final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); + final Dialect dialect = jdbcEnvironment.getDialect(); + + // Drop all AuxiliaryDatabaseObjects + for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : database.getAuxiliaryDatabaseObjects() ) { + if ( !auxiliaryDatabaseObject.appliesToDialect( dialect ) ) { + continue; + } + + applySqlStrings( + dialect.getAuxiliaryDatabaseObjectExporter().getSqlDropStrings( auxiliaryDatabaseObject, metadata ), + targets, + true + ); + } + + // Create before-table AuxiliaryDatabaseObjects + for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : database.getAuxiliaryDatabaseObjects() ) { + if ( auxiliaryDatabaseObject.beforeTablesOnCreation() ) { + continue; + } + if ( !auxiliaryDatabaseObject.appliesToDialect( dialect ) ) { + continue; + } + + applySqlStrings( + auxiliaryDatabaseObject.sqlCreateStrings( jdbcEnvironment.getDialect() ), + targets, + true + ); + } + boolean tryToCreateCatalogs = false; boolean tryToCreateSchemas = false; @@ -175,6 +208,22 @@ public class SchemaMigratorImpl implements SchemaMigrator { ); } } + + // Create after-table AuxiliaryDatabaseObjects + for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : database.getAuxiliaryDatabaseObjects() ) { + if ( !auxiliaryDatabaseObject.beforeTablesOnCreation() ) { + continue; + } + if ( !auxiliaryDatabaseObject.appliesToDialect( dialect ) ) { + continue; + } + + applySqlStrings( + auxiliaryDatabaseObject.sqlCreateStrings( jdbcEnvironment.getDialect() ), + targets, + true + ); + } } private void createTable(Table table, Metadata metadata, List targets) {