HHH-10298 - Add new configuration type hibernate.hbm2dll.extra_physical_table_types

This commit is contained in:
Andrea Boriero 2015-11-18 13:34:12 +00:00
parent c7b8f73b46
commit aefdda0978
3 changed files with 66 additions and 14 deletions

View File

@ -929,6 +929,15 @@ public interface AvailableSettings {
*/ */
String ENABLE_SYNONYMS = "hibernate.synonyms"; String ENABLE_SYNONYMS = "hibernate.synonyms";
/**
* Identifies a comma-separate list of values to specify extra table types,
* other than the default "TABLE" value, to recognize as defining a physical table
* by schema update, creation and validation.
*
* @since 5.0
*/
String EXTRA_PHYSICAL_TABLE_TYPES = "hibernate.hbm2dll.extra_physical_table_types";
/** /**
* Unique columns and unique keys both use unique constraints in most dialects. * Unique columns and unique keys both use unique constraints in most dialects.
* SchemaUpdate needs to create these constraints, but DB's * SchemaUpdate needs to create these constraints, but DB's
@ -965,11 +974,4 @@ public interface AvailableSettings {
*/ */
String AUTO_SESSION_EVENTS_LISTENER = "hibernate.session.events.auto"; String AUTO_SESSION_EVENTS_LISTENER = "hibernate.session.events.auto";
} }

View File

@ -236,12 +236,12 @@ public final class StringHelper {
} }
public static String[] split(String seperators, String list) { public static String[] split(String separators, String list) {
return split( seperators, list, false ); return split( separators, list, false );
} }
public static String[] split(String seperators, String list, boolean include) { public static String[] split(String separators, String list, boolean include) {
StringTokenizer tokens = new StringTokenizer( list, seperators, include ); StringTokenizer tokens = new StringTokenizer( list, separators, include );
String[] result = new String[tokens.countTokens()]; String[] result = new String[tokens.countTokens()];
int i = 0; int i = 0;
while ( tokens.hasMoreTokens() ) { while ( tokens.hasMoreTokens() ) {
@ -250,6 +250,16 @@ public final class StringHelper {
return result; return result;
} }
public static String[] splitTrimmingTokens(String separators, String list, boolean include) {
StringTokenizer tokens = new StringTokenizer( list, separators, include );
String[] result = new String[tokens.countTokens()];
int i = 0;
while ( tokens.hasMoreTokens() ) {
result[i++] = tokens.nextToken().trim();
}
return result;
}
public static String unqualify(String qualifiedName) { public static String unqualify(String qualifiedName) {
int loc = qualifiedName.lastIndexOf( "." ); int loc = qualifiedName.lastIndexOf( "." );
return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( loc + 1 ); return ( loc < 0 ) ? qualifiedName : qualifiedName.substring( loc + 1 );

View File

@ -23,9 +23,12 @@ import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.QualifiedTableName;
import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.AvailableSettings;
import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.ConfigurationService;
import org.hibernate.engine.config.spi.StandardConverters;
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
import org.hibernate.internal.CoreLogging; import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.CoreMessageLogger;
import org.hibernate.internal.util.StringHelper;
import org.hibernate.internal.util.collections.ArrayHelper;
import org.hibernate.internal.util.compare.EqualsHelper; import org.hibernate.internal.util.compare.EqualsHelper;
import org.hibernate.internal.util.config.ConfigurationHelper; import org.hibernate.internal.util.config.ConfigurationHelper;
import org.hibernate.tool.schema.extract.spi.ColumnInformation; import org.hibernate.tool.schema.extract.spi.ColumnInformation;
@ -49,6 +52,8 @@ public class InformationExtractorJdbcDatabaseMetaDataImpl implements Information
private final String[] tableTypes; private final String[] tableTypes;
private String[] extraPhysicalTableTypes;
private final ExtractionContext extractionContext; private final ExtractionContext extractionContext;
public InformationExtractorJdbcDatabaseMetaDataImpl(ExtractionContext extractionContext) { public InformationExtractorJdbcDatabaseMetaDataImpl(ExtractionContext extractionContext) {
@ -56,11 +61,33 @@ public class InformationExtractorJdbcDatabaseMetaDataImpl implements Information
ConfigurationService configService = extractionContext.getServiceRegistry() ConfigurationService configService = extractionContext.getServiceRegistry()
.getService( ConfigurationService.class ); .getService( ConfigurationService.class );
final String extraPhysycalTableTypesConfig = configService.getSetting(
AvailableSettings.EXTRA_PHYSICAL_TABLE_TYPES,
StandardConverters.STRING,
""
);
if ( !"".equals( extraPhysycalTableTypesConfig.trim() ) ) {
this.extraPhysicalTableTypes = StringHelper.splitTrimmingTokens(
",;",
extraPhysycalTableTypesConfig,
false
);
}
final String[] tempTableTypes;
if ( ConfigurationHelper.getBoolean( AvailableSettings.ENABLE_SYNONYMS, configService.getSettings(), false ) ) { if ( ConfigurationHelper.getBoolean( AvailableSettings.ENABLE_SYNONYMS, configService.getSettings(), false ) ) {
this.tableTypes = new String[] { "TABLE", "VIEW", "SYNONYM" }; tempTableTypes = new String[] {"TABLE", "VIEW", "SYNONYM"};
} }
else { else {
this.tableTypes = new String[] { "TABLE", "VIEW" }; tempTableTypes = new String[] {"TABLE", "VIEW"};
}
if ( this.extraPhysicalTableTypes != null ) {
this.tableTypes = ArrayHelper.join( tempTableTypes, this.extraPhysicalTableTypes );
}
else {
this.tableTypes = tempTableTypes;
} }
} }
@ -373,8 +400,21 @@ public class InformationExtractorJdbcDatabaseMetaDataImpl implements Information
} }
protected boolean isPhysicalTableType(String tableType) { protected boolean isPhysicalTableType(String tableType) {
if ( extraPhysicalTableTypes == null ) {
return "TABLE".equalsIgnoreCase( tableType ); return "TABLE".equalsIgnoreCase( tableType );
} }
else {
if ( "TABLE".equalsIgnoreCase( tableType ) ) {
return true;
}
for ( int i = 0; i < extraPhysicalTableTypes.length; i++ ) {
if ( extraPhysicalTableTypes[i].equalsIgnoreCase( tableType ) ) {
return true;
}
}
return false;
}
}
@Override @Override
public ColumnInformation getColumn(TableInformation tableInformation, Identifier columnIdentifier) { public ColumnInformation getColumn(TableInformation tableInformation, Identifier columnIdentifier) {