HHH-10298 - Add new configuration type hibernate.hbm2dll.extra_physical_table_types
This commit is contained in:
parent
c7b8f73b46
commit
aefdda0978
|
@ -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";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in New Issue