diff --git a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/hbm/transform/HbmXmlTransformer.java b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/hbm/transform/HbmXmlTransformer.java index 0a6da85029..c0c50c5792 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/jaxb/hbm/transform/HbmXmlTransformer.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/jaxb/hbm/transform/HbmXmlTransformer.java @@ -203,6 +203,7 @@ import static org.hibernate.boot.jaxb.hbm.transform.HbmTransformationLogging.TRANSFORMATION_LOGGER; import static org.hibernate.internal.util.StringHelper.isNotEmpty; +import static org.hibernate.internal.util.StringHelper.nullIfEmpty; /** * Transforms {@code hbm.xml} {@linkplain JaxbHbmHibernateMapping JAXB} bindings into @@ -1205,7 +1206,7 @@ else if ( !source.getColumnOrFormula().isEmpty() ) { } } } - else if ( StringHelper.isNotEmpty( tableName ) ) { + else if ( isNotEmpty( tableName ) ) { // this is the case of transforming a where the property did not specify columns or formula. // we need to create a column still to pass along the secondary table name final TargetColumnAdapter column = target.makeColumnAdapter( columnDefaults ); @@ -1590,7 +1591,7 @@ public Boolean isUpdateable() { } private JaxbUserTypeImpl interpretBasicType(String typeName, JaxbHbmConfigParameterContainer typeLocalParams, JaxbHbmTypeDefinitionType typeDef) { - assert StringHelper.isNotEmpty( typeName ); + assert isNotEmpty( typeName ); final JaxbUserTypeImpl typeNode = new JaxbUserTypeImpl(); @@ -1624,7 +1625,7 @@ private JaxbEmbeddableImpl applyEmbeddable( JaxbHbmCompositeAttributeType hbmComponent, ComponentTypeInfo componentTypeInfo) { final String embeddableClassName = componentTypeInfo.getComponent().getComponentClassName(); - if ( StringHelper.isNotEmpty( embeddableClassName ) ) { + if ( isNotEmpty( embeddableClassName ) ) { final JaxbEmbeddableImpl existing = jaxbEmbeddableByClassName.get( embeddableClassName ); if ( existing != null ) { return existing; @@ -1641,7 +1642,7 @@ private JaxbEmbeddableImpl applyEmbeddable( ); mappingXmlBinding.getRoot().getEmbeddables().add( jaxbEmbeddable ); - if ( StringHelper.isNotEmpty( embeddableClassName ) ) { + if ( isNotEmpty( embeddableClassName ) ) { jaxbEmbeddableByClassName.put( embeddableClassName, jaxbEmbeddable ); } @@ -1668,7 +1669,7 @@ private JaxbEmbeddableImpl convertEmbeddable( private int counter = 1; private String determineEmbeddableName(String componentClassName, String attributeName) { - if ( StringHelper.isNotEmpty( componentClassName ) ) { + if ( isNotEmpty( componentClassName ) ) { return componentClassName; } return attributeName + "_" + counter++; @@ -1692,7 +1693,7 @@ private void transferOneToOne(JaxbHbmOneToOneType hbmOneToOne, PropertyInfo prop oneToOne.setOrphanRemoval( isOrphanRemoval( hbmOneToOne.getCascade() ) ); oneToOne.setForeignKey( new JaxbForeignKeyImpl() ); oneToOne.getForeignKey().setName( hbmOneToOne.getForeignKey() ); - if ( StringHelper.isNotEmpty( hbmOneToOne.getPropertyRef() ) ) { + if ( isNotEmpty( hbmOneToOne.getPropertyRef() ) ) { oneToOne.setPropertyRef( new JaxbPropertyRefImpl() ); oneToOne.getPropertyRef().setName( hbmOneToOne.getPropertyRef() ); } @@ -1736,7 +1737,7 @@ private JaxbManyToOneImpl transformManyToOne(JaxbHbmManyToOneType hbmNode, Prope jaxbManyToOne.setAttributeAccessor( hbmNode.getAccess() ); jaxbManyToOne.setCascade( convertCascadeType( hbmNode.getCascade() ) ); - if ( StringHelper.isNotEmpty( hbmNode.getPropertyRef() ) ) { + if ( isNotEmpty( hbmNode.getPropertyRef() ) ) { jaxbManyToOne.setPropertyRef( new JaxbPropertyRefImpl() ); jaxbManyToOne.getPropertyRef().setName( hbmNode.getPropertyRef() ); } @@ -1905,7 +1906,7 @@ private void transferCollectionCommonInfo(PluralAttributeInfo source, JaxbPlural target.setFetchMode( convert( source.getFetch() ) ); target.setFetch( convert( source.getLazy() ) ); - if ( StringHelper.isNotEmpty( source.getCollectionType() ) ) { + if ( isNotEmpty( source.getCollectionType() ) ) { final JaxbCollectionUserTypeImpl jaxbCollectionUserType = new JaxbCollectionUserTypeImpl(); target.setCollectionType( jaxbCollectionUserType ); jaxbCollectionUserType.setType( source.getCollectionType() ); @@ -1913,7 +1914,7 @@ private void transferCollectionCommonInfo(PluralAttributeInfo source, JaxbPlural if ( source instanceof JaxbHbmSetType set ) { final String sort = set.getSort(); - if ( StringHelper.isNotEmpty( sort ) && !"unsorted".equals( sort ) ) { + if ( isNotEmpty( sort ) && !"unsorted".equals( sort ) ) { target.setSort( sort ); } target.setOrderBy( set.getOrderBy() ); @@ -1921,7 +1922,7 @@ private void transferCollectionCommonInfo(PluralAttributeInfo source, JaxbPlural } else if ( source instanceof JaxbHbmMapType map ) { final String sort = map.getSort(); - if ( StringHelper.isNotEmpty( sort ) && !"unsorted".equals( sort ) ) { + if ( isNotEmpty( sort ) && !"unsorted".equals( sort ) ) { target.setSort( sort ); } target.setOrderBy( map.getOrderBy() ); @@ -2025,7 +2026,7 @@ else if ( source.getMapKey() != null ) { return; } - if ( StringHelper.isNotEmpty( source.getMapKey().getNode() ) ) { + if ( isNotEmpty( source.getMapKey().getNode() ) ) { handleUnsupported( "Transformation of `node` attribute is not supported - %s", origin() @@ -2040,7 +2041,7 @@ else if ( source.getMapKey() != null ) { jaxbMapKeyType.setValue( mapKeyType ); } - if ( StringHelper.isNotEmpty( source.getMapKey().getColumnAttribute() ) ) { + if ( isNotEmpty( source.getMapKey().getColumnAttribute() ) ) { final JaxbMapKeyColumnImpl mapKeyColumn = new JaxbMapKeyColumnImpl(); mapKeyColumn.setName( source.getMapKey().getColumnAttribute() ); target.setMapKeyColumn( mapKeyColumn ); @@ -2049,38 +2050,32 @@ else if ( source.getMapKey() != null ) { } private String resolveMapKeyType(JaxbHbmMapKeyBasicType mapKey) { - if ( StringHelper.isNotEmpty( mapKey.getTypeAttribute() ) ) { + if ( isNotEmpty( mapKey.getTypeAttribute() ) ) { return mapKey.getTypeAttribute(); } - - if ( mapKey.getType() != null ) { - return StringHelper.nullIfEmpty( mapKey.getType().getName() ); + else if ( mapKey.getType() != null ) { + return nullIfEmpty( mapKey.getType().getName() ); + } + else { + return null; } - - return null; } private Boolean invert(Boolean value) { - return invert( value, null ); - } - - private Boolean invert(Boolean value, Boolean defaultValue) { - if ( value == null ) { - return defaultValue; - } - return !value; + return value == null ? null : !value; } private JaxbPluralFetchModeImpl convert(JaxbHbmFetchStyleWithSubselectEnum fetch) { - if ( fetch != null ) { + if ( fetch == null ) { + return null; + } + else { return switch ( fetch ) { case SELECT -> JaxbPluralFetchModeImpl.SELECT; case JOIN -> JaxbPluralFetchModeImpl.JOIN; case SUBSELECT -> JaxbPluralFetchModeImpl.SUBSELECT; }; } - - return null; } @@ -2181,7 +2176,7 @@ private void transferElementInfo( final ComponentTypeInfo componentTypeInfo = transformationState.getEmbeddableInfoByRole().get( partRole ); target.setTarget( embeddableName ); - if ( StringHelper.isNotEmpty( embeddableClassName ) ) { + if ( isNotEmpty( embeddableClassName ) ) { target.setTargetClass( embeddableClassName ); } @@ -2217,7 +2212,7 @@ private void transferOneToManyInfo( } transferCollectionCommonInfo( hbmAttributeInfo, target ); - target.setTargetEntity( StringHelper.isNotEmpty( hbmOneToMany.getClazz() ) ? hbmOneToMany.getClazz() : hbmOneToMany.getEntityName() ); + target.setTargetEntity( isNotEmpty( hbmOneToMany.getClazz() ) ? hbmOneToMany.getClazz() : hbmOneToMany.getEntityName() ); final Property bootModelProperty = propertyInfo.bootModelProperty(); final Collection bootModelValue = (Collection) bootModelProperty.getValue(); @@ -2291,7 +2286,7 @@ public void addFormula(String formula) { target.getFilters().add( convert( hbmFilter ) ); } - if ( StringHelper.isNotEmpty( hbmAttributeInfo.getWhere() ) ) { + if ( isNotEmpty( hbmAttributeInfo.getWhere() ) ) { target.setSqlRestriction( hbmAttributeInfo.getWhere() ); } if ( hbmAttributeInfo.getSqlInsert() != null ) { @@ -2320,7 +2315,7 @@ private String resolveMappedBy( PluralAttributeInfo hbmAttributeInfo, Property bootModelProperty, Collection bootModelValue) { - if ( StringHelper.isNotEmpty( bootModelValue.getMappedByProperty() ) ) { + if ( isNotEmpty( bootModelValue.getMappedByProperty() ) ) { return bootModelValue.getMappedByProperty(); } @@ -2369,8 +2364,8 @@ private boolean matches(KeyValue collectionKey, List candidate) { final Column collectionKeyColumn = (Column) collectionKeySelectable; final Column candidateColumn = (Column) candidateSelectable; - assert StringHelper.isNotEmpty( collectionKeyColumn.getCanonicalName() ); - assert StringHelper.isNotEmpty( candidateColumn.getCanonicalName() ); + assert isNotEmpty( collectionKeyColumn.getCanonicalName() ); + assert isNotEmpty( candidateColumn.getCanonicalName() ); if ( !collectionKeyColumn.getCanonicalName().equals( candidateColumn.getCanonicalName() ) ) { return false; } @@ -2400,7 +2395,7 @@ private void transferManyToManyInfo( if ( manyToMany.isEmbedXml() != null ) { handleUnsupported( "`embed-xml` no longer supported" ); } - if ( StringHelper.isNotEmpty( manyToMany.getNode() ) ) { + if ( isNotEmpty( manyToMany.getNode() ) ) { handleUnsupported( "`node` no longer supported" ); } @@ -2409,7 +2404,7 @@ private void transferManyToManyInfo( final JaxbJoinTableImpl joinTable = new JaxbJoinTableImpl(); final String tableName = hbmCollection.getTable(); - if ( StringHelper.isNotEmpty( tableName ) ) { + if ( isNotEmpty( tableName ) ) { joinTable.setName( tableName ); } target.setJoinTable( joinTable ); @@ -2503,7 +2498,7 @@ public void addFormula(String formula) { ); transferCollectionCommonInfo( hbmCollection, target ); - target.setTargetEntity( StringHelper.isNotEmpty( manyToMany.getClazz() ) ? manyToMany.getClazz() : manyToMany.getEntityName() ); + target.setTargetEntity( isNotEmpty( manyToMany.getClazz() ) ? manyToMany.getClazz() : manyToMany.getEntityName() ); if ( manyToMany.getNotFound() == JaxbHbmNotFoundEnum.IGNORE ) { target.setNotFound( NotFoundAction.IGNORE ); @@ -2513,7 +2508,7 @@ public void addFormula(String formula) { target.getFilters().add( convert( hbmFilter ) ); } - if ( StringHelper.isNotEmpty( hbmCollection.getWhere() ) ) { + if ( isNotEmpty( hbmCollection.getWhere() ) ) { target.setSqlRestriction( hbmCollection.getWhere() ); } if ( hbmCollection.getSqlInsert() != null ) { @@ -2664,7 +2659,7 @@ private JaxbEmbeddableImpl transformEmbeddedIdEmbeddable( EntityTypeInfo bootEntityInfo, Property idProperty) { final String embeddableClassName = hbmCompositeId.getClazz(); - if ( StringHelper.isNotEmpty( embeddableClassName ) ) { + if ( isNotEmpty( embeddableClassName ) ) { final JaxbEmbeddableImpl existing = jaxbEmbeddableByClassName.get( embeddableClassName ); if ( existing != null ) { return existing; diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java index 8bd332ea2f..89c53310aa 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/AbstractInformationExtractorImpl.java @@ -9,7 +9,6 @@ import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Locale; @@ -18,7 +17,6 @@ import java.util.StringTokenizer; import org.hibernate.JDBCException; -import org.hibernate.boot.model.naming.DatabaseIdentifier; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.cfg.AvailableSettings; @@ -31,8 +29,6 @@ import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport; import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreMessageLogger; -import org.hibernate.internal.util.StringHelper; -import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.tool.schema.extract.spi.ColumnInformation; import org.hibernate.tool.schema.extract.spi.ExtractionContext; import org.hibernate.tool.schema.extract.spi.ForeignKeyInformation; @@ -44,6 +40,12 @@ import org.hibernate.tool.schema.extract.spi.TableInformation; import org.hibernate.tool.schema.spi.SchemaManagementException; +import static java.util.Collections.addAll; +import static org.hibernate.boot.model.naming.DatabaseIdentifier.toIdentifier; +import static org.hibernate.internal.util.StringHelper.isBlank; +import static org.hibernate.internal.util.StringHelper.splitTrimmingTokens; +import static org.hibernate.internal.util.config.ConfigurationHelper.getBoolean; + public abstract class AbstractInformationExtractorImpl implements InformationExtractor { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( AbstractInformationExtractorImpl.class ); @@ -65,7 +67,7 @@ public abstract class AbstractInformationExtractorImpl implements InformationExt public AbstractInformationExtractorImpl(ExtractionContext extractionContext) { this.extractionContext = extractionContext; - ConfigurationService configService = + final ConfigurationService configService = extractionContext.getServiceRegistry().requireService( ConfigurationService.class ); useJdbcMetadataDefaultsSetting = configService.getSetting( @@ -84,15 +86,8 @@ public AbstractInformationExtractorImpl(ExtractionContext extractionContext) { ) ); final List physicalTableTypesList = new ArrayList<>(); - if ( ! StringHelper.isBlank( extraPhysicalTableTypesConfig ) ) { - Collections.addAll( - physicalTableTypesList, - StringHelper.splitTrimmingTokens( - ",;", - extraPhysicalTableTypesConfig, - false - ) - ); + if ( !isBlank( extraPhysicalTableTypesConfig ) ) { + addAll( physicalTableTypesList, splitTrimmingTokens( ",;", extraPhysicalTableTypesConfig, false ) ); } final Dialect dialect = extractionContext.getJdbcEnvironment().getDialect(); dialect.augmentPhysicalTableTypes( physicalTableTypesList ); @@ -101,34 +96,38 @@ public AbstractInformationExtractorImpl(ExtractionContext extractionContext) { final List tableTypesList = new ArrayList<>(); tableTypesList.add( "TABLE" ); tableTypesList.add( "VIEW" ); - if ( ConfigurationHelper.getBoolean( AvailableSettings.ENABLE_SYNONYMS, configService.getSettings() ) ) { + if ( getBoolean( AvailableSettings.ENABLE_SYNONYMS, configService.getSettings() ) ) { if ( dialect instanceof DB2Dialect ) { tableTypesList.add( "ALIAS" ); } tableTypesList.add( "SYNONYM" ); } - Collections.addAll( tableTypesList, extraPhysicalTableTypes ); + addAll( tableTypesList, extraPhysicalTableTypes ); dialect.augmentRecognizedTableTypes( tableTypesList ); this.tableTypes = tableTypesList.toArray( new String[0] ); } protected IdentifierHelper identifierHelper() { - return extractionContext.getJdbcEnvironment().getIdentifierHelper(); + return getIdentifierHelper(); } protected JDBCException convertSQLException(SQLException sqlException, String message) { - return extractionContext.getJdbcEnvironment().getSqlExceptionHelper().convert( sqlException, message ); + return getJdbcEnvironment().getSqlExceptionHelper().convert( sqlException, message ); } protected String toMetaDataObjectName(Identifier identifier) { - return extractionContext.getJdbcEnvironment().getIdentifierHelper().toMetaDataObjectName( identifier ); + return getIdentifierHelper().toMetaDataObjectName( identifier ); } protected ExtractionContext getExtractionContext() { return extractionContext; } + protected JdbcEnvironment getJdbcEnvironment() { + return extractionContext.getJdbcEnvironment(); + } + // The following methods purposely return the column labels that are defined by // DatabaseMetaData methods that return a ResultSet. Subclasses that do not rely // on DatabaseMetaData may override these methods to use different column labels. @@ -222,20 +221,16 @@ protected String getResultSetForeignKeyColumnNameLabel() { public boolean catalogExists(Identifier catalog) { try { return processCatalogsResultSet( resultSet -> { - while ( resultSet.next() ) { final String existingCatalogName = resultSet.getString( getResultSetCatalogLabel() ); - // todo : hmm.. case sensitive or insensitive match... // for now, match any case... - if ( catalog.getText().equalsIgnoreCase( existingCatalogName ) ) { return true; } } - return false; - }); + } ); } catch (SQLException sqlException) { throw convertSQLException( sqlException, "Unable to query ResultSet for existing catalogs" ); @@ -313,13 +308,17 @@ public boolean schemaExists(Identifier catalog, Identifier schema) { } } + private IdentifierHelper getIdentifierHelper() { + return getJdbcEnvironment().getIdentifierHelper(); + } + protected String determineCatalogFilter(Identifier catalog) { Identifier identifierToUse = catalog; if ( identifierToUse == null ) { identifierToUse = extractionContext.getDefaultCatalog(); } - return extractionContext.getJdbcEnvironment().getIdentifierHelper().toMetaDataCatalogName( identifierToUse ); + return getIdentifierHelper().toMetaDataCatalogName( identifierToUse ); } protected String determineSchemaFilter(Identifier schema) { @@ -328,16 +327,14 @@ protected String determineSchemaFilter(Identifier schema) { identifierToUse = extractionContext.getDefaultSchema(); } - return extractionContext.getJdbcEnvironment().getIdentifierHelper().toMetaDataSchemaName( identifierToUse ); + return getIdentifierHelper().toMetaDataSchemaName( identifierToUse ); } private TableInformation extractTableInformation(ResultSet resultSet) throws SQLException { - final QualifiedTableName tableName = extractTableName( resultSet ); - return new TableInformationImpl( this, identifierHelper(), - tableName, + extractTableName( resultSet ), isPhysicalTableType( resultSet.getString( getResultSetTableTypeLabel() ) ), resultSet.getString( getResultSetRemarksLabel() ) ); @@ -357,33 +354,24 @@ public TableInformation getTable(Identifier catalog, Identifier schema, Identifi // 2) look in default namespace // 3) look in all namespaces - multiple hits is considered an error - TableInformation tableInfo; - // 1) look in current namespace - final JdbcEnvironment jdbcEnvironment = extractionContext.getJdbcEnvironment(); - final Identifier currentSchema = getCurrentSchema( jdbcEnvironment ); - final Identifier currentCatalog = getCurrentCatalog( jdbcEnvironment ); - if ( currentCatalog != null - || currentSchema != null ) { - tableInfo = locateTableInNamespace( - currentCatalog, - currentSchema, - tableName - ); - + final Identifier currentSchema = getCurrentSchema(); + final Identifier currentCatalog = getCurrentCatalog(); + if ( currentCatalog != null || currentSchema != null ) { + final TableInformation tableInfo = + locateTableInNamespace( currentCatalog, currentSchema, tableName ); if ( tableInfo != null ) { return tableInfo; } } // 2) look in default namespace - if ( extractionContext.getDefaultCatalog() != null || extractionContext.getDefaultSchema() != null ) { - tableInfo = locateTableInNamespace( - extractionContext.getDefaultCatalog(), - extractionContext.getDefaultSchema(), - tableName - ); - + final Identifier defaultCatalog = extractionContext.getDefaultCatalog(); + final Identifier defaultSchema = extractionContext.getDefaultSchema(); + if ( defaultCatalog != null + || defaultSchema != null ) { + final TableInformation tableInfo = + locateTableInNamespace( defaultCatalog, defaultSchema, tableName ); if ( tableInfo != null ) { return tableInfo; } @@ -391,19 +379,12 @@ public TableInformation getTable(Identifier catalog, Identifier schema, Identifi // 3) look in all namespaces try { - final String tableNameFilter = toMetaDataObjectName( tableName ); - return processTableResultSet( null, null, - tableNameFilter, + toMetaDataObjectName( tableName ), tableTypes, - resultSet -> extractTableInformation( - null, - null, - tableName, - resultSet - ) + resultSet -> extractTableInformation( null, null, tableName, resultSet ) ); } catch (SQLException sqlException) { @@ -412,21 +393,20 @@ public TableInformation getTable(Identifier catalog, Identifier schema, Identifi } } - private Identifier getCurrentSchema(JdbcEnvironment jdbcEnvironment) { - if ( jdbcEnvironment.getNameQualifierSupport() == NameQualifierSupport.CATALOG ) { + private Identifier getCurrentSchema() { + if ( getNameQualifierSupport() == NameQualifierSupport.CATALOG ) { return null; } if ( currentSchema != null ) { return currentSchema; } - final Identifier schema = jdbcEnvironment.getCurrentSchema(); + final Identifier schema = getJdbcEnvironment().getCurrentSchema(); if ( schema != null ) { currentSchema = schema; } if ( !useJdbcMetadataDefaultsSetting ) { try { - currentSchema = extractionContext.getJdbcEnvironment() - .getIdentifierHelper() + currentSchema = getIdentifierHelper() .toIdentifier( extractionContext.getJdbcConnection().getSchema() ); } catch (SQLException sqle) { @@ -439,25 +419,24 @@ private Identifier getCurrentSchema(JdbcEnvironment jdbcEnvironment) { return currentSchema; } - private Identifier getCurrentCatalog(JdbcEnvironment jdbcEnvironment) { - if ( jdbcEnvironment.getNameQualifierSupport() == NameQualifierSupport.SCHEMA ) { + private Identifier getCurrentCatalog() { + if ( getNameQualifierSupport() == NameQualifierSupport.SCHEMA ) { return null; } if ( currentCatalog != null ) { return currentCatalog; } - final Identifier catalog = jdbcEnvironment.getCurrentCatalog(); + final Identifier catalog = getJdbcEnvironment().getCurrentCatalog(); if ( catalog != null ) { currentCatalog = catalog; } if ( !useJdbcMetadataDefaultsSetting ) { try { - currentCatalog = extractionContext.getJdbcEnvironment() - .getIdentifierHelper() + currentCatalog = getIdentifierHelper() .toIdentifier( extractionContext.getJdbcConnection().getCatalog() ); } - catch (SQLException ignore) { - LOG.sqlWarning( ignore.getErrorCode(), ignore.getSQLState() ); + catch (SQLException sqle) { + LOG.sqlWarning( sqle.getErrorCode(), sqle.getSQLState() ); } } return currentCatalog; @@ -475,8 +454,8 @@ private String getCurrentCatalogFilter(JdbcEnvironment jdbcEnvironment) { try { currentCatalogFilter = extractionContext.getJdbcConnection().getCatalog(); } - catch (SQLException ignore) { - LOG.sqlWarning( ignore.getErrorCode(), ignore.getSQLState() ); + catch (SQLException sqle) { + LOG.sqlWarning( sqle.getErrorCode(), sqle.getSQLState() ); } } return currentCatalogFilter; @@ -495,8 +474,8 @@ private String getCurrentSchemaFilter(JdbcEnvironment jdbcEnvironment) { try { currentSchemaFilter = extractionContext.getJdbcConnection().getSchema(); } - catch (SQLException ignore) { - LOG.sqlWarning( ignore.getErrorCode(), ignore.getSQLState() ); + catch (SQLException sqle) { + LOG.sqlWarning( sqle.getErrorCode(), sqle.getSQLState() ); } catch (AbstractMethodError ignore) { // jConnect and jTDS report that they "support" schemas, but they don't really @@ -511,12 +490,12 @@ public NameSpaceTablesInformation getTables(Identifier catalog, Identifier schem final String catalogFilter; final String schemaFilter; - final JdbcEnvironment jdbcEnvironment = extractionContext.getJdbcEnvironment(); - final NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport(); + final NameQualifierSupport nameQualifierSupport = getNameQualifierSupport(); + if ( nameQualifierSupport.supportsCatalogs() ) { if ( catalog == null ) { // look in the current namespace - final String currentCatalogFilter = getCurrentCatalogFilter(jdbcEnvironment); + final String currentCatalogFilter = getCurrentCatalogFilter( getJdbcEnvironment() ); if ( currentCatalogFilter != null ) { catalogFilter = currentCatalogFilter; } @@ -541,7 +520,7 @@ public NameSpaceTablesInformation getTables(Identifier catalog, Identifier schem if ( nameQualifierSupport.supportsSchemas() ) { if ( schema == null ) { // 1) look in current namespace - final String currentSchemaFilter = getCurrentSchemaFilter( jdbcEnvironment ); + final String currentSchemaFilter = getCurrentSchemaFilter( getJdbcEnvironment() ); if ( currentSchemaFilter != null ) { schemaFilter = currentSchemaFilter; } @@ -570,7 +549,8 @@ public NameSpaceTablesInformation getTables(Identifier catalog, Identifier schem "%", tableTypes, resultSet -> { - final NameSpaceTablesInformation tablesInformation = extractNameSpaceTablesInformation( resultSet ); + final NameSpaceTablesInformation tablesInformation = + extractNameSpaceTablesInformation( resultSet ); populateTablesWithColumns( catalogFilter, schemaFilter, tablesInformation ); return tablesInformation; } ); @@ -665,10 +645,7 @@ private void populateTablesWithColumns( ); } catch (SQLException e) { - throw convertSQLException( - e, - "Error accessing tables metadata" - ); + throw convertSQLException( e, "Error accessing tables metadata" ); } } @@ -676,7 +653,7 @@ protected void addExtractedColumnInformation(TableInformation tableInformation, throws SQLException { final ColumnInformation columnInformation = new ColumnInformationImpl( tableInformation, - DatabaseIdentifier.toIdentifier( resultSet.getString( getResultSetColumnNameLabel() ) ), + toIdentifier( resultSet.getString( getResultSetColumnNameLabel() ) ), resultSet.getInt( getResultSetSqlTypeCodeLabel() ), new StringTokenizer( resultSet.getString( getResultSetTypeNameLabel() ), "()" ).nextToken(), resultSet.getInt( getResultSetColumnSizeLabel() ), @@ -687,7 +664,7 @@ protected void addExtractedColumnInformation(TableInformation tableInformation, } private NameSpaceTablesInformation extractNameSpaceTablesInformation(ResultSet resultSet) throws SQLException { - NameSpaceTablesInformation tables = new NameSpaceTablesInformation(identifierHelper()); + final NameSpaceTablesInformation tables = new NameSpaceTablesInformation( identifierHelper() ); while ( resultSet.next() ) { final TableInformation tableInformation = extractTableInformation( resultSet ); tables.addTableInformation( tableInformation ); @@ -757,15 +734,15 @@ private TableInformation locateTableInNamespace( final String catalogFilter; final String schemaFilter; - if ( extractionContext.getJdbcEnvironment().getNameQualifierSupport().supportsCatalogs() ) { + final NameQualifierSupport nameQualifierSupport = getNameQualifierSupport(); + if ( nameQualifierSupport.supportsCatalogs() ) { if ( catalog == null ) { - String defaultCatalog = ""; - if ( extractionContext.getJdbcEnvironment().getNameQualifierSupport().supportsCatalogs() ) { - try { - defaultCatalog = extractionContext.getJdbcConnection().getCatalog(); - } - catch (SQLException ignore) { - } + String defaultCatalog; + try { + defaultCatalog = extractionContext.getJdbcConnection().getCatalog(); + } + catch (SQLException ignore) { + defaultCatalog = ""; } catalogToUse = null; catalogFilter = defaultCatalog; @@ -780,7 +757,7 @@ private TableInformation locateTableInNamespace( catalogFilter = null; } - if ( extractionContext.getJdbcEnvironment().getNameQualifierSupport().supportsSchemas() ) { + if ( nameQualifierSupport.supportsSchemas() ) { if ( schema == null ) { schemaToUse = null; schemaFilter = ""; @@ -817,6 +794,10 @@ private TableInformation locateTableInNamespace( } } + private NameQualifierSupport getNameQualifierSupport() { + return getJdbcEnvironment().getNameQualifierSupport(); + } + private TableInformation extractTableInformation( Identifier catalog, Identifier schema, @@ -825,23 +806,19 @@ private TableInformation extractTableInformation( boolean found = false; TableInformation tableInformation = null; - while ( resultSet.next() ) { - if ( tableName.equals( Identifier.toIdentifier( resultSet.getString( getResultSetTableNameLabel() ), tableName.isQuoted() ) ) ) { if ( found ) { LOG.multipleTablesFound( tableName.render() ); - final String catalogName = catalog == null ? "" : catalog.render(); - final String schemaName = schema == null ? "" : schema.render(); throw new SchemaExtractionException( String.format( Locale.ENGLISH, "More than one table found in namespace (%s, %s) : %s", - catalogName, - schemaName, + catalog == null ? "" : catalog.render(), + schema == null ? "" : schema.render(), tableName.render() ) ); @@ -882,18 +859,13 @@ protected void addColumns(TableInformation tableInformation) { final QualifiedTableName tableName = tableInformation.getName(); final Identifier catalog = tableName.getCatalogName(); final Identifier schema = tableName.getSchemaName(); - - final String catalogFilter = catalog == null ? "" : catalog.getText(); - final String schemaFilter = schema == null ? "" : schema.getText(); - try { processColumnsResultSet( - catalogFilter, - schemaFilter, + catalog == null ? "" : catalog.getText(), + schema == null ? "" : schema.getText(), tableName.getTableName().getText(), "%", resultSet -> { - while ( resultSet.next() ) { addExtractedColumnInformation( tableInformation, resultSet ); } @@ -903,10 +875,7 @@ protected void addColumns(TableInformation tableInformation) { } catch (SQLException e) { - throw convertSQLException( - e, - "Error accessing tables metadata" - ); + throw convertSQLException( e, "Error accessing tables metadata" ); } } @@ -942,34 +911,18 @@ public PrimaryKeyInformation getPrimaryKey(TableInformationImpl tableInformation final QualifiedTableName tableName = tableInformation.getName(); final Identifier catalog = tableName.getCatalogName(); final Identifier schema = tableName.getSchemaName(); - - final String catalogFilter; - final String schemaFilter; - - if ( catalog == null ) { - catalogFilter = ""; - } - else { - catalogFilter = catalog.getText(); - } - - if ( schema == null ) { - schemaFilter = ""; - } - else { - schemaFilter = schema.getText(); - } - try { return processPrimaryKeysResultSet( - catalogFilter, - schemaFilter, + catalog == null ? "" : catalog.getText(), + schema == null ? "" : schema.getText(), tableInformation.getName().getTableName(), resultSet -> extractPrimaryKeyInformation( tableInformation, resultSet ) ); } catch (SQLException e) { - throw convertSQLException( e, "Error while reading primary key meta data for " + tableInformation.getName().toString() ); + throw convertSQLException( e, + "Error while reading primary key meta data for " + + tableInformation.getName() ); } } @@ -984,9 +937,7 @@ private PrimaryKeyInformation extractPrimaryKeyInformation( while ( resultSet.next() ) { final String currentPkName = resultSet.getString( getResultSetPrimaryKeyNameLabel() ); - final Identifier currentPkIdentifier = currentPkName == null - ? null - : DatabaseIdentifier.toIdentifier( currentPkName ); + final Identifier currentPkIdentifier = currentPkName == null ? null : toIdentifier( currentPkName ); if ( firstPass ) { pkIdentifier = currentPkIdentifier; firstPass = false; @@ -1003,15 +954,13 @@ private PrimaryKeyInformation extractPrimaryKeyInformation( } final int columnPosition = resultSet.getInt( getResultSetColumnPositionColumn() ); - final int index = columnPosition - 1; // Fill up the array list with nulls up to the desired index, because some JDBC drivers don't return results ordered by column position while ( pkColumns.size() <= index ) { pkColumns.add( null ); } - final Identifier columnIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetColumnNameLabel() ) - ); + final Identifier columnIdentifier = + toIdentifier( resultSet.getString( getResultSetColumnNameLabel() ) ); pkColumns.set( index, tableInformation.getColumn( columnIdentifier ) ); } if ( firstPass ) { @@ -1025,7 +974,6 @@ private PrimaryKeyInformation extractPrimaryKeyInformation( throw new SchemaExtractionException( "Primary Key information was missing for KEY_SEQ = " + ( i+1) ); } } - // build the return return new PrimaryKeyInformationImpl( pkIdentifier, pkColumns ); } @@ -1110,62 +1058,44 @@ protected abstract T processIndexInfoResultSet( @Override public Iterable getIndexes(TableInformation tableInformation) { - final Map builders = new HashMap<>(); final QualifiedTableName tableName = tableInformation.getName(); final Identifier catalog = tableName.getCatalogName(); final Identifier schema = tableName.getSchemaName(); - final String catalogFilter; - final String schemaFilter; - - if ( catalog == null ) { - catalogFilter = ""; - } - else { - catalogFilter = catalog.getText(); - } - - if ( schema == null ) { - schemaFilter = ""; - } - else { - schemaFilter = schema.getText(); - } - + final Map builders = new HashMap<>(); try { processIndexInfoResultSet( - catalogFilter, - schemaFilter, + catalog == null ? "" : catalog.getText(), + schema == null ? "" : schema.getText(), tableName.getTableName().getText(), false, // DO NOT limit to just unique true, // DO require up-to-date results resultSet -> { while ( resultSet.next() ) { - if ( resultSet.getShort( getResultSetIndexTypeLabel() ) == DatabaseMetaData.tableIndexStatistic ) { - continue; + if ( resultSet.getShort( getResultSetIndexTypeLabel() ) + != DatabaseMetaData.tableIndexStatistic ) { + final Identifier indexIdentifier = + toIdentifier( resultSet.getString( getResultSetIndexNameLabel() ) ); + IndexInformationImpl.Builder builder = builders.get( indexIdentifier ); + if ( builder == null ) { + builder = IndexInformationImpl.builder( indexIdentifier ); + builders.put( indexIdentifier, builder ); + } + + final Identifier columnIdentifier = + toIdentifier( resultSet.getString( getResultSetColumnNameLabel() ) ); + final ColumnInformation columnInformation = + tableInformation.getColumn( columnIdentifier ); + if ( columnInformation == null ) { + // See HHH-10191: this may happen when dealing with Oracle/PostgreSQL function indexes + LOG.logCannotLocateIndexColumnInformation( + columnIdentifier.getText(), + indexIdentifier.getText() + ); + } + builder.addColumn( columnInformation ); } - final Identifier indexIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetIndexNameLabel() ) - ); - IndexInformationImpl.Builder builder = builders.get( indexIdentifier ); - if ( builder == null ) { - builder = IndexInformationImpl.builder( indexIdentifier ); - builders.put( indexIdentifier, builder ); - } - - final Identifier columnIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetColumnNameLabel() ) - ); - final ColumnInformation columnInformation = tableInformation.getColumn( columnIdentifier ); - if ( columnInformation == null ) { - // See HHH-10191: this may happen when dealing with Oracle/PostgreSQL function indexes - LOG.logCannotLocateIndexColumnInformation( - columnIdentifier.getText(), - indexIdentifier.getText() - ); - } - builder.addColumn( columnInformation ); } return null; } @@ -1173,10 +1103,9 @@ public Iterable getIndexes(TableInformation tableInformation) } catch (SQLException e) { - throw convertSQLException( - e, - "Error accessing index information: " + tableInformation.getName().toString() - ); + throw convertSQLException( e, + "Error accessing index information: " + + tableInformation.getName() ); } final List indexes = new ArrayList<>(); @@ -1348,91 +1277,41 @@ protected abstract T processCrossReferenceResultSet( @Override public Iterable getForeignKeys(TableInformation tableInformation) { - final Map fkBuilders = new HashMap<>(); final QualifiedTableName tableName = tableInformation.getName(); final Identifier catalog = tableName.getCatalogName(); final Identifier schema = tableName.getSchemaName(); - final String catalogFilter; - final String schemaFilter; - - if ( catalog == null ) { - catalogFilter = ""; - } - else { - catalogFilter = catalog.getText(); - } - - if ( schema == null ) { - schemaFilter = ""; - } - else { - schemaFilter = schema.getText(); - } + final String catalogFilter = catalog == null ? "" : catalog.getText(); + final String schemaFilter = schema == null ? "" : schema.getText(); + final Map fkBuilders = new HashMap<>(); try { - ExtractionContext.ResultSetProcessor processor = resultSet -> { - while ( resultSet.next() ) { - // IMPL NOTE : The builder is mainly used to collect the column reference mappings - final Identifier fkIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetForeignKeyLabel() ) - ); - ForeignKeyBuilder fkBuilder = fkBuilders.get( fkIdentifier ); - if ( fkBuilder == null ) { - fkBuilder = generateForeignKeyBuilder( fkIdentifier ); - fkBuilders.put( fkIdentifier, fkBuilder ); - } - - final QualifiedTableName incomingPkTableName = extractPrimaryKeyTableName( resultSet ); - - final TableInformation pkTableInformation = extractionContext.getDatabaseObjectAccess() - .locateTableInformation( incomingPkTableName ); - - if ( pkTableInformation == null ) { - // the assumption here is that we have not seen this table already based on fully-qualified name - // during previous step of building all table metadata so most likely this is - // not a match based solely on schema/catalog and that another row in this result set - // should match. - continue; - } - - final Identifier fkColumnIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetForeignKeyColumnNameLabel() ) - ); - final Identifier pkColumnIdentifier = DatabaseIdentifier.toIdentifier( - resultSet.getString( getResultSetPrimaryKeyColumnNameLabel() ) - ); - - fkBuilder.addColumnMapping( - tableInformation.getColumn( fkColumnIdentifier ), - pkTableInformation.getColumn( pkColumnIdentifier ) - ); - } - return null; - }; - processImportedKeysResultSet( - catalogFilter, - schemaFilter, - tableInformation.getName().getTableName().getText(), - processor); - final Dialect dialect = extractionContext.getJdbcEnvironment().getDialect(); - if (dialect.useCrossReferenceForeignKeys()) { + final String table = tableInformation.getName().getTableName().getText(); + processImportedKeysResultSet( catalogFilter, schemaFilter, table, + resultSet -> { + process( tableInformation, resultSet, fkBuilders ); + return null; + } ); + final Dialect dialect = getJdbcEnvironment().getDialect(); + if ( dialect.useCrossReferenceForeignKeys() ) { processCrossReferenceResultSet( null, null, dialect.getCrossReferenceParentTableFilter(), catalogFilter, schemaFilter, - tableInformation.getName().getTableName().getText(), - processor + table, + resultSet -> { + process( tableInformation, resultSet, fkBuilders ); + return null; + } ); } } catch (SQLException e) { - throw convertSQLException( - e, - "Error accessing column metadata: " + tableInformation.getName().toString() - ); + throw convertSQLException( e, + "Error accessing column metadata: " + + tableInformation.getName() ); } final List fks = new ArrayList<>(); @@ -1443,6 +1322,37 @@ public Iterable getForeignKeys(TableInformation tableInfo return fks; } + private void process(TableInformation tableInformation, ResultSet resultSet, Map fkBuilders) + throws SQLException { + while ( resultSet.next() ) { + // IMPL NOTE : The builder is mainly used to collect the column reference mappings + final Identifier fkIdentifier = toIdentifier( resultSet.getString( getResultSetForeignKeyLabel() ) ); + ForeignKeyBuilder fkBuilder = fkBuilders.get( fkIdentifier ); + if ( fkBuilder == null ) { + fkBuilder = generateForeignKeyBuilder( fkIdentifier ); + fkBuilders.put( fkIdentifier, fkBuilder ); + } + + final TableInformation pkTableInformation = extractionContext.getDatabaseObjectAccess() + .locateTableInformation( extractPrimaryKeyTableName( resultSet ) ); + if ( pkTableInformation != null ) { + // the assumption here is that we have not seen this table already based on fully-qualified name + // during previous step of building all table metadata so most likely this is + // not a match based solely on schema/catalog and that another row in this result set + // should match. + final Identifier fkColumnIdentifier = + toIdentifier( resultSet.getString( getResultSetForeignKeyColumnNameLabel() ) ); + final Identifier pkColumnIdentifier = + toIdentifier( resultSet.getString( getResultSetPrimaryKeyColumnNameLabel() ) ); + fkBuilder.addColumnMapping( + tableInformation.getColumn( fkColumnIdentifier ), + pkTableInformation.getColumn( pkColumnIdentifier ) + ); + } + + } + } + private ForeignKeyBuilder generateForeignKeyBuilder(Identifier fkIdentifier) { return new ForeignKeyBuilderImpl( fkIdentifier ); } @@ -1480,27 +1390,18 @@ public ForeignKeyInformationImpl build() { } private QualifiedTableName extractPrimaryKeyTableName(ResultSet resultSet) throws SQLException { - final String incomingCatalogName = resultSet.getString( getResultSetPrimaryKeyCatalogLabel() ); - final String incomingSchemaName = resultSet.getString( getResultSetPrimaryKeySchemaLabel() ); - final String incomingTableName = resultSet.getString( getResultSetPrimaryKeyTableLabel() ); - - final DatabaseIdentifier catalog = DatabaseIdentifier.toIdentifier( incomingCatalogName ); - final DatabaseIdentifier schema = DatabaseIdentifier.toIdentifier( incomingSchemaName ); - final DatabaseIdentifier table = DatabaseIdentifier.toIdentifier( incomingTableName ); - - return new QualifiedTableName( catalog, schema, table ); + return new QualifiedTableName( + toIdentifier( resultSet.getString( getResultSetPrimaryKeyCatalogLabel() ) ), + toIdentifier( resultSet.getString( getResultSetPrimaryKeySchemaLabel() ) ), + toIdentifier( resultSet.getString( getResultSetPrimaryKeyTableLabel() ) ) ); } private QualifiedTableName extractTableName(ResultSet resultSet) throws SQLException { - final String incomingCatalogName = resultSet.getString( getResultSetCatalogLabel() ); - final String incomingSchemaName = resultSet.getString( getResultSetSchemaLabel() ); - final String incomingTableName = resultSet.getString( getResultSetTableNameLabel() ); - - final DatabaseIdentifier catalog = DatabaseIdentifier.toIdentifier( incomingCatalogName ); - final DatabaseIdentifier schema = DatabaseIdentifier.toIdentifier( incomingSchemaName ); - final DatabaseIdentifier table = DatabaseIdentifier.toIdentifier( incomingTableName ); - - return new QualifiedTableName( catalog, schema, table ); + return new QualifiedTableName( + toIdentifier( resultSet.getString( getResultSetCatalogLabel() ) ), + toIdentifier( resultSet.getString( getResultSetSchemaLabel() ) ), + toIdentifier( resultSet.getString( getResultSetTableNameLabel() ) ) + ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java index 0eddf5a192..5306139a2c 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/InformationExtractorJdbcDatabaseMetaDataImpl.java @@ -4,6 +4,7 @@ */ package org.hibernate.tool.schema.extract.internal; +import java.sql.DatabaseMetaData; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.SQLException; @@ -28,6 +29,10 @@ public InformationExtractorJdbcDatabaseMetaDataImpl(ExtractionContext extraction super( extractionContext ); } + private DatabaseMetaData getJdbcDatabaseMetaData() { + return getExtractionContext().getJdbcDatabaseMetaData(); + } + @Override protected String getResultSetTableTypesPhysicalTableConstant() { return "TABLE"; @@ -35,7 +40,7 @@ protected String getResultSetTableTypesPhysicalTableConstant() { @Override public T processCatalogsResultSet(ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getCatalogs() ) { + try (ResultSet resultSet = getJdbcDatabaseMetaData().getCatalogs() ) { return processor.process( resultSet ); } } @@ -45,7 +50,7 @@ protected T processSchemaResultSet( String catalog, String schemaPattern, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getSchemas( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getSchemas( catalog, schemaPattern ) ) { return processor.process( resultSet ); @@ -60,7 +65,7 @@ protected T processTableResultSet( String[] types, ExtractionContext.ResultSetProcessor processor ) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getTables( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getTables( catalog, schemaPattern, tableNamePattern, @@ -76,7 +81,7 @@ protected T processColumnsResultSet( String tableNamePattern, String columnNamePattern, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getColumns( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getColumns( catalog, schemaPattern, tableNamePattern, @@ -91,7 +96,7 @@ protected T processPrimaryKeysResultSet( String schemaFilter, Identifier tableName, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try( ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getPrimaryKeys( + try( ResultSet resultSet = getJdbcDatabaseMetaData().getPrimaryKeys( catalogFilter, schemaFilter, tableName.getText() ) ) { @@ -108,7 +113,7 @@ protected T processIndexInfoResultSet( boolean approximate, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getIndexInfo( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getIndexInfo( catalog, schema, table, @@ -124,7 +129,7 @@ protected T processImportedKeysResultSet( String schema, String table, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getImportedKeys( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getImportedKeys( catalog, schema, table ) ) { @@ -141,7 +146,7 @@ protected T processCrossReferenceResultSet( String foreignSchema, String foreignTable, ExtractionContext.ResultSetProcessor processor) throws SQLException { - try (ResultSet resultSet = getExtractionContext().getJdbcDatabaseMetaData().getCrossReference( + try (ResultSet resultSet = getJdbcDatabaseMetaData().getCrossReference( parentCatalog, parentSchema, parentTable, @@ -153,9 +158,9 @@ protected T processCrossReferenceResultSet( } protected void addColumns(TableInformation tableInformation) { - final Dialect dialect = getExtractionContext().getJdbcEnvironment().getDialect(); - + final Dialect dialect = getJdbcEnvironment().getDialect(); final ExtractionContext extractionContext = getExtractionContext(); + // We use this dummy query to retrieve the table information through the ResultSetMetaData // This is significantly better than to use the DatabaseMetaData especially on Oracle with synonyms enabled final String tableName = extractionContext.getSqlStringGenerationContext().format(