HHH-14922 Delay applying the implicit catalog/schema until schema management tool or session factory creation
This is necessary if we want the default catalog/schema to take precedence, since the default catalog/schema is applied late, on schema management tool or session factory creation.
This commit is contained in:
parent
9b47fcdfa8
commit
795d5cd4e9
|
@ -35,7 +35,7 @@ public class Database {
|
||||||
private final ServiceRegistry serviceRegistry;
|
private final ServiceRegistry serviceRegistry;
|
||||||
private final PhysicalNamingStrategy physicalNamingStrategy;
|
private final PhysicalNamingStrategy physicalNamingStrategy;
|
||||||
|
|
||||||
private Namespace implicitNamespace;
|
private Namespace.Name physicalImplicitNamespaceName;
|
||||||
private List<InitCommand> initCommands;
|
private List<InitCommand> initCommands;
|
||||||
|
|
||||||
public Database(MetadataBuildingOptions buildingOptions) {
|
public Database(MetadataBuildingOptions buildingOptions) {
|
||||||
|
@ -48,11 +48,16 @@ public class Database {
|
||||||
this.physicalNamingStrategy = buildingOptions.getPhysicalNamingStrategy();
|
this.physicalNamingStrategy = buildingOptions.getPhysicalNamingStrategy();
|
||||||
this.dialect = determineDialect( buildingOptions );
|
this.dialect = determineDialect( buildingOptions );
|
||||||
|
|
||||||
this.implicitNamespace = makeNamespace(
|
setImplicitNamespaceName(
|
||||||
new Namespace.Name(
|
|
||||||
toIdentifier( buildingOptions.getMappingDefaults().getImplicitCatalogName() ),
|
toIdentifier( buildingOptions.getMappingDefaults().getImplicitCatalogName() ),
|
||||||
toIdentifier( buildingOptions.getMappingDefaults().getImplicitSchemaName() )
|
toIdentifier( buildingOptions.getMappingDefaults().getImplicitSchemaName() )
|
||||||
)
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void setImplicitNamespaceName(Identifier catalogName, Identifier schemaName) {
|
||||||
|
this.physicalImplicitNamespaceName = new Namespace.Name(
|
||||||
|
physicalNamingStrategy.toPhysicalCatalogName( catalogName, jdbcEnvironment ),
|
||||||
|
physicalNamingStrategy.toPhysicalSchemaName( schemaName, jdbcEnvironment )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,15 +113,25 @@ public class Database {
|
||||||
return namespaceMap.values();
|
return namespaceMap.values();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The default namespace, with a {@code null} catalog and schema
|
||||||
|
* which will have to be interpreted with defaults at runtime.
|
||||||
|
* @see SqlStringGenerationContext
|
||||||
|
*/
|
||||||
public Namespace getDefaultNamespace() {
|
public Namespace getDefaultNamespace() {
|
||||||
return implicitNamespace;
|
return locateNamespace( null, null );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @return The implicit name of the default namespace, with a {@code null} catalog and schema
|
||||||
|
* which will have to be interpreted with defaults at runtime.
|
||||||
|
* @see SqlStringGenerationContext
|
||||||
|
*/
|
||||||
|
public Namespace.Name getPhysicalImplicitNamespaceName() {
|
||||||
|
return physicalImplicitNamespaceName;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Namespace locateNamespace(Identifier catalogName, Identifier schemaName) {
|
public Namespace locateNamespace(Identifier catalogName, Identifier schemaName) {
|
||||||
if ( catalogName == null && schemaName == null ) {
|
|
||||||
return getDefaultNamespace();
|
|
||||||
}
|
|
||||||
|
|
||||||
final Namespace.Name name = new Namespace.Name( catalogName, schemaName );
|
final Namespace.Name name = new Namespace.Name( catalogName, schemaName );
|
||||||
Namespace namespace = namespaceMap.get( name );
|
Namespace namespace = namespaceMap.get( name );
|
||||||
if ( namespace == null ) {
|
if ( namespace == null ) {
|
||||||
|
@ -126,17 +141,8 @@ public class Database {
|
||||||
}
|
}
|
||||||
|
|
||||||
public Namespace adjustDefaultNamespace(Identifier catalogName, Identifier schemaName) {
|
public Namespace adjustDefaultNamespace(Identifier catalogName, Identifier schemaName) {
|
||||||
final Namespace.Name name = new Namespace.Name( catalogName, schemaName );
|
setImplicitNamespaceName( catalogName, schemaName );
|
||||||
if ( implicitNamespace.getName().equals( name ) ) {
|
return locateNamespace( catalogName, schemaName );
|
||||||
return implicitNamespace;
|
|
||||||
}
|
|
||||||
|
|
||||||
Namespace namespace = namespaceMap.get( name );
|
|
||||||
if ( namespace == null ) {
|
|
||||||
namespace = makeNamespace( name );
|
|
||||||
}
|
|
||||||
implicitNamespace = namespace;
|
|
||||||
return implicitNamespace;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Namespace adjustDefaultNamespace(String implicitCatalogName, String implicitSchemaName) {
|
public Namespace adjustDefaultNamespace(String implicitCatalogName, String implicitSchemaName) {
|
||||||
|
|
|
@ -36,6 +36,12 @@ public interface SqlStringGenerationContext {
|
||||||
*/
|
*/
|
||||||
Identifier getDefaultCatalog();
|
Identifier getDefaultCatalog();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param explicitCatalogOrNull An explicitly configured catalog, or {@code null}.
|
||||||
|
* @return The given identifier if non-{@code null}, or the default catalog otherwise.
|
||||||
|
*/
|
||||||
|
Identifier catalogWithDefault(Identifier explicitCatalogOrNull);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return The default schema, used for table/sequence names that do not explicitly mention a schema.
|
* @return The default schema, used for table/sequence names that do not explicitly mention a schema.
|
||||||
* May be {@code null}.
|
* May be {@code null}.
|
||||||
|
@ -44,6 +50,12 @@ public interface SqlStringGenerationContext {
|
||||||
*/
|
*/
|
||||||
Identifier getDefaultSchema();
|
Identifier getDefaultSchema();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param explicitSchemaOrNull An explicitly configured schema, or {@code null}.
|
||||||
|
* @return The given identifier if non-{@code null}, or the default schema otherwise.
|
||||||
|
*/
|
||||||
|
Identifier schemaWithDefault(Identifier explicitSchemaOrNull);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Render a formatted a table name
|
* Render a formatted a table name
|
||||||
*
|
*
|
||||||
|
|
|
@ -47,7 +47,7 @@ public class SqlStringGenerationContextImpl
|
||||||
*/
|
*/
|
||||||
public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment,
|
public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment,
|
||||||
Database database, String defaultCatalog, String defaultSchema) {
|
Database database, String defaultCatalog, String defaultSchema) {
|
||||||
Namespace.Name implicitNamespaceName = database.getDefaultNamespace().getPhysicalName();
|
Namespace.Name implicitNamespaceName = database.getPhysicalImplicitNamespaceName();
|
||||||
IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper();
|
IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper();
|
||||||
NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport();
|
NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport();
|
||||||
Identifier actualDefaultCatalog = null;
|
Identifier actualDefaultCatalog = null;
|
||||||
|
@ -107,11 +107,48 @@ public class SqlStringGenerationContextImpl
|
||||||
return defaultCatalog;
|
return defaultCatalog;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Identifier catalogWithDefault(Identifier explicitCatalogOrNull) {
|
||||||
|
return explicitCatalogOrNull != null ? explicitCatalogOrNull : defaultCatalog;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Identifier getDefaultSchema() {
|
public Identifier getDefaultSchema() {
|
||||||
return defaultSchema;
|
return defaultSchema;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Identifier schemaWithDefault(Identifier explicitSchemaOrNull) {
|
||||||
|
return explicitSchemaOrNull != null ? explicitSchemaOrNull : defaultSchema;
|
||||||
|
}
|
||||||
|
|
||||||
|
private QualifiedTableName withDefaults(QualifiedTableName name) {
|
||||||
|
if ( name.getCatalogName() == null && defaultCatalog != null
|
||||||
|
|| name.getSchemaName() == null && defaultSchema != null ) {
|
||||||
|
return new QualifiedTableName( catalogWithDefault( name.getCatalogName() ),
|
||||||
|
schemaWithDefault( name.getSchemaName() ), name.getTableName() );
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private QualifiedSequenceName withDefaults(QualifiedSequenceName name) {
|
||||||
|
if ( name.getCatalogName() == null && defaultCatalog != null
|
||||||
|
|| name.getSchemaName() == null && defaultSchema != null ) {
|
||||||
|
return new QualifiedSequenceName( catalogWithDefault( name.getCatalogName() ),
|
||||||
|
schemaWithDefault( name.getSchemaName() ), name.getSequenceName() );
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
private QualifiedName withDefaults(QualifiedName name) {
|
||||||
|
if ( name.getCatalogName() == null && defaultCatalog != null
|
||||||
|
|| name.getSchemaName() == null && defaultSchema != null ) {
|
||||||
|
return new QualifiedSequenceName( catalogWithDefault( name.getCatalogName() ),
|
||||||
|
schemaWithDefault( name.getSchemaName() ), name.getObjectName() );
|
||||||
|
}
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String format(QualifiedTableName qualifiedName) {
|
public String format(QualifiedTableName qualifiedName) {
|
||||||
return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect );
|
return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect );
|
||||||
|
@ -127,37 +164,6 @@ public class SqlStringGenerationContextImpl
|
||||||
return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect );
|
return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect );
|
||||||
}
|
}
|
||||||
|
|
||||||
private QualifiedTableName withDefaults(QualifiedTableName name) {
|
|
||||||
if ( name.getCatalogName() == null && defaultCatalog != null
|
|
||||||
|| name.getSchemaName() == null && defaultSchema != null ) {
|
|
||||||
return new QualifiedTableName( withDefault( name.getCatalogName(), defaultCatalog ),
|
|
||||||
withDefault( name.getSchemaName(), defaultSchema ), name.getTableName() );
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private QualifiedSequenceName withDefaults(QualifiedSequenceName name) {
|
|
||||||
if ( name.getCatalogName() == null && defaultCatalog != null
|
|
||||||
|| name.getSchemaName() == null && defaultSchema != null ) {
|
|
||||||
return new QualifiedSequenceName( withDefault( name.getCatalogName(), defaultCatalog ),
|
|
||||||
withDefault( name.getSchemaName(), defaultSchema ), name.getSequenceName() );
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private QualifiedName withDefaults(QualifiedName name) {
|
|
||||||
if ( name.getCatalogName() == null && defaultCatalog != null
|
|
||||||
|| name.getSchemaName() == null && defaultSchema != null ) {
|
|
||||||
return new QualifiedSequenceName( withDefault( name.getCatalogName(), defaultCatalog ),
|
|
||||||
withDefault( name.getSchemaName(), defaultSchema ), name.getObjectName() );
|
|
||||||
}
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static Identifier withDefault(Identifier value, Identifier defaultValue) {
|
|
||||||
return value != null ? value : defaultValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String formatWithoutCatalog(QualifiedSequenceName qualifiedName) {
|
public String formatWithoutCatalog(QualifiedSequenceName qualifiedName) {
|
||||||
QualifiedSequenceName nameToFormat;
|
QualifiedSequenceName nameToFormat;
|
||||||
|
|
|
@ -804,15 +804,6 @@ public class ModelBinder {
|
||||||
// YUCK! but cannot think of a clean way to do this given the string-config based scheme
|
// YUCK! but cannot think of a clean way to do this given the string-config based scheme
|
||||||
params.put( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, objectNameNormalizer);
|
params.put( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, objectNameNormalizer);
|
||||||
|
|
||||||
String implicitSchemaName = metadataBuildingContext.getMappingDefaults().getImplicitSchemaName();
|
|
||||||
if ( implicitSchemaName != null ) {
|
|
||||||
params.setProperty( PersistentIdentifierGenerator.SCHEMA, implicitSchemaName );
|
|
||||||
}
|
|
||||||
String implicitCatalogName = metadataBuildingContext.getMappingDefaults().getImplicitCatalogName();
|
|
||||||
if ( implicitCatalogName != null ) {
|
|
||||||
params.setProperty( PersistentIdentifierGenerator.CATALOG, implicitCatalogName );
|
|
||||||
}
|
|
||||||
|
|
||||||
params.putAll( generator.getParameters() );
|
params.putAll( generator.getParameters() );
|
||||||
|
|
||||||
identifierValue.setIdentifierGeneratorProperties( params );
|
identifierValue.setIdentifierGeneratorProperties( params );
|
||||||
|
@ -2966,7 +2957,7 @@ public class ModelBinder {
|
||||||
return database.toIdentifier( tableSpecSource.getExplicitSchemaName() );
|
return database.toIdentifier( tableSpecSource.getExplicitSchemaName() );
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return database.toIdentifier( metadataBuildingContext.getMappingDefaults().getImplicitSchemaName() );
|
return null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,7 +149,6 @@ import org.hibernate.cfg.annotations.TableBinder;
|
||||||
import org.hibernate.cfg.internal.NullableDiscriminatorColumnSecondPass;
|
import org.hibernate.cfg.internal.NullableDiscriminatorColumnSecondPass;
|
||||||
import org.hibernate.engine.OptimisticLockStyle;
|
import org.hibernate.engine.OptimisticLockStyle;
|
||||||
import org.hibernate.engine.spi.FilterDefinition;
|
import org.hibernate.engine.spi.FilterDefinition;
|
||||||
import org.hibernate.id.PersistentIdentifierGenerator;
|
|
||||||
import org.hibernate.internal.CoreMessageLogger;
|
import org.hibernate.internal.CoreMessageLogger;
|
||||||
import org.hibernate.internal.util.StringHelper;
|
import org.hibernate.internal.util.StringHelper;
|
||||||
import org.hibernate.jpa.event.internal.CallbackDefinitionResolverLegacyImpl;
|
import org.hibernate.jpa.event.internal.CallbackDefinitionResolverLegacyImpl;
|
||||||
|
@ -467,20 +466,6 @@ public final class AnnotationBinder {
|
||||||
|
|
||||||
IdentifierGeneratorDefinition.Builder definitionBuilder = new IdentifierGeneratorDefinition.Builder();
|
IdentifierGeneratorDefinition.Builder definitionBuilder = new IdentifierGeneratorDefinition.Builder();
|
||||||
|
|
||||||
if ( context.getMappingDefaults().getImplicitSchemaName() != null ) {
|
|
||||||
definitionBuilder.addParam(
|
|
||||||
PersistentIdentifierGenerator.SCHEMA,
|
|
||||||
context.getMappingDefaults().getImplicitSchemaName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( context.getMappingDefaults().getImplicitCatalogName() != null ) {
|
|
||||||
definitionBuilder.addParam(
|
|
||||||
PersistentIdentifierGenerator.CATALOG,
|
|
||||||
context.getMappingDefaults().getImplicitCatalogName()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( generatorAnn instanceof TableGenerator ) {
|
if ( generatorAnn instanceof TableGenerator ) {
|
||||||
context.getBuildingOptions().getIdGenerationTypeInterpreter().interpretTableGenerator(
|
context.getBuildingOptions().getIdGenerationTypeInterpreter().interpretTableGenerator(
|
||||||
(TableGenerator) generatorAnn,
|
(TableGenerator) generatorAnn,
|
||||||
|
|
|
@ -525,15 +525,6 @@ public class BinderHelper {
|
||||||
PersistentIdentifierGenerator.TABLE, table.getName()
|
PersistentIdentifierGenerator.TABLE, table.getName()
|
||||||
);
|
);
|
||||||
|
|
||||||
final String implicitCatalogName = buildingContext.getBuildingOptions().getMappingDefaults().getImplicitCatalogName();
|
|
||||||
if ( implicitCatalogName != null ) {
|
|
||||||
params.put( PersistentIdentifierGenerator.CATALOG, implicitCatalogName );
|
|
||||||
}
|
|
||||||
final String implicitSchemaName = buildingContext.getBuildingOptions().getMappingDefaults().getImplicitSchemaName();
|
|
||||||
if ( implicitSchemaName != null ) {
|
|
||||||
params.put( PersistentIdentifierGenerator.SCHEMA, implicitSchemaName );
|
|
||||||
}
|
|
||||||
|
|
||||||
if ( id.getColumnSpan() == 1 ) {
|
if ( id.getColumnSpan() == 1 ) {
|
||||||
params.setProperty(
|
params.setProperty(
|
||||||
PersistentIdentifierGenerator.PK,
|
PersistentIdentifierGenerator.PK,
|
||||||
|
|
|
@ -50,8 +50,8 @@ public final class Settings {
|
||||||
public Settings(SessionFactoryOptions sessionFactoryOptions, Metadata metadata) {
|
public Settings(SessionFactoryOptions sessionFactoryOptions, Metadata metadata) {
|
||||||
this(
|
this(
|
||||||
sessionFactoryOptions,
|
sessionFactoryOptions,
|
||||||
extractName( metadata.getDatabase().getDefaultNamespace().getName().getCatalog() ),
|
extractName( metadata.getDatabase().getPhysicalImplicitNamespaceName().getCatalog() ),
|
||||||
extractName( metadata.getDatabase().getDefaultNamespace().getName().getSchema() )
|
extractName( metadata.getDatabase().getPhysicalImplicitNamespaceName().getSchema() )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -477,10 +477,10 @@ public class TableBinder {
|
||||||
String subselect,
|
String subselect,
|
||||||
InFlightMetadataCollector.EntityTableXref denormalizedSuperTableXref) {
|
InFlightMetadataCollector.EntityTableXref denormalizedSuperTableXref) {
|
||||||
schema = BinderHelper.isEmptyOrNullAnnotationValue( schema )
|
schema = BinderHelper.isEmptyOrNullAnnotationValue( schema )
|
||||||
? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitSchemaName()
|
? null
|
||||||
: schema;
|
: schema;
|
||||||
catalog = BinderHelper.isEmptyOrNullAnnotationValue( catalog )
|
catalog = BinderHelper.isEmptyOrNullAnnotationValue( catalog )
|
||||||
? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitCatalogName()
|
? null
|
||||||
: catalog;
|
: catalog;
|
||||||
|
|
||||||
final Table table;
|
final Table table;
|
||||||
|
|
|
@ -407,7 +407,9 @@ public class JPAXMLOverriddenAnnotationReader implements AnnotationReader {
|
||||||
*/
|
*/
|
||||||
private void initAnnotations() {
|
private void initAnnotations() {
|
||||||
if ( annotations == null ) {
|
if ( annotations == null ) {
|
||||||
XMLContext.Default defaults = xmlContext.getDefault( className );
|
// We don't want the global catalog and schema here: they are applied much later,
|
||||||
|
// when SQL gets rendered.
|
||||||
|
XMLContext.Default defaults = xmlContext.getDefaultWithoutGlobalCatalogAndSchema( className );
|
||||||
if ( className != null && propertyName == null ) {
|
if ( className != null && propertyName == null ) {
|
||||||
//is a class
|
//is a class
|
||||||
ManagedType managedTypeOverride = xmlContext.getManagedTypeOverride( className );
|
ManagedType managedTypeOverride = xmlContext.getManagedTypeOverride( className );
|
||||||
|
|
|
@ -94,7 +94,7 @@ public final class JPAXMLOverriddenMetadataProvider implements MetadataProvider
|
||||||
else {
|
else {
|
||||||
if ( defaults == null ) {
|
if ( defaults == null ) {
|
||||||
defaults = new HashMap<>();
|
defaults = new HashMap<>();
|
||||||
XMLContext.Default xmlDefaults = xmlContext.getDefault( null );
|
XMLContext.Default xmlDefaults = xmlContext.getDefaultWithGlobalCatalogAndSchema();
|
||||||
|
|
||||||
defaults.put( "schema", xmlDefaults.getSchema() );
|
defaults.put( "schema", xmlDefaults.getSchema() );
|
||||||
defaults.put( "catalog", xmlDefaults.getCatalog() );
|
defaults.put( "catalog", xmlDefaults.getCatalog() );
|
||||||
|
|
|
@ -124,12 +124,12 @@ public class XMLContext implements Serializable {
|
||||||
managedTypeOverride.put( className, element );
|
managedTypeOverride.put( className, element );
|
||||||
Default mergedDefaults = new Default();
|
Default mergedDefaults = new Default();
|
||||||
// Apply entity mapping defaults
|
// Apply entity mapping defaults
|
||||||
mergedDefaults.override( defaults );
|
mergedDefaults.overrideWithCatalogAndSchema( defaults );
|
||||||
// ... then apply entity settings
|
// ... then apply entity settings
|
||||||
Default fileDefaults = new Default();
|
Default fileDefaults = new Default();
|
||||||
fileDefaults.setMetadataComplete( element.isMetadataComplete() );
|
fileDefaults.setMetadataComplete( element.isMetadataComplete() );
|
||||||
fileDefaults.setAccess( element.getAccess() );
|
fileDefaults.setAccess( element.getAccess() );
|
||||||
mergedDefaults.override( fileDefaults );
|
mergedDefaults.overrideWithCatalogAndSchema( fileDefaults );
|
||||||
// ... and we get the merged defaults for that entity
|
// ... and we get the merged defaults for that entity
|
||||||
defaultsOverride.put( className, mergedDefaults );
|
defaultsOverride.put( className, mergedDefaults );
|
||||||
|
|
||||||
|
@ -196,16 +196,22 @@ public class XMLContext implements Serializable {
|
||||||
return buildSafeClassName( className, defaults.getPackageName() );
|
return buildSafeClassName( className, defaults.getPackageName() );
|
||||||
}
|
}
|
||||||
|
|
||||||
public Default getDefault(String className) {
|
public Default getDefaultWithoutGlobalCatalogAndSchema(String className) {
|
||||||
Default xmlDefault = new Default();
|
Default xmlDefault = new Default();
|
||||||
xmlDefault.override( globalDefaults );
|
xmlDefault.overrideWithoutCatalogAndSchema( globalDefaults );
|
||||||
if ( className != null ) {
|
if ( className != null ) {
|
||||||
Default entityMappingOverriding = defaultsOverride.get( className );
|
Default entityMappingOverriding = defaultsOverride.get( className );
|
||||||
xmlDefault.override( entityMappingOverriding );
|
xmlDefault.overrideWithCatalogAndSchema( entityMappingOverriding );
|
||||||
}
|
}
|
||||||
return xmlDefault;
|
return xmlDefault;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Default getDefaultWithGlobalCatalogAndSchema() {
|
||||||
|
Default xmlDefault = new Default();
|
||||||
|
xmlDefault.overrideWithCatalogAndSchema( globalDefaults );
|
||||||
|
return xmlDefault;
|
||||||
|
}
|
||||||
|
|
||||||
public ManagedType getManagedTypeOverride(String className) {
|
public ManagedType getManagedTypeOverride(String className) {
|
||||||
return managedTypeOverride.get( className );
|
return managedTypeOverride.get( className );
|
||||||
}
|
}
|
||||||
|
@ -292,7 +298,19 @@ public class XMLContext implements Serializable {
|
||||||
this.cascadePersist = cascadePersist;
|
this.cascadePersist = cascadePersist;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void override(Default globalDefault) {
|
public void overrideWithCatalogAndSchema(Default override) {
|
||||||
|
overrideWithoutCatalogAndSchema( override );
|
||||||
|
if ( override != null ) {
|
||||||
|
if ( override.getSchema() != null ) {
|
||||||
|
schema = override.getSchema();
|
||||||
|
}
|
||||||
|
if ( override.getCatalog() != null ) {
|
||||||
|
catalog = override.getCatalog();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void overrideWithoutCatalogAndSchema(Default globalDefault) {
|
||||||
if ( globalDefault != null ) {
|
if ( globalDefault != null ) {
|
||||||
if ( globalDefault.getAccess() != null ) {
|
if ( globalDefault.getAccess() != null ) {
|
||||||
access = globalDefault.getAccess();
|
access = globalDefault.getAccess();
|
||||||
|
@ -300,12 +318,6 @@ public class XMLContext implements Serializable {
|
||||||
if ( globalDefault.getPackageName() != null ) {
|
if ( globalDefault.getPackageName() != null ) {
|
||||||
packageName = globalDefault.getPackageName();
|
packageName = globalDefault.getPackageName();
|
||||||
}
|
}
|
||||||
if ( globalDefault.getSchema() != null ) {
|
|
||||||
schema = globalDefault.getSchema();
|
|
||||||
}
|
|
||||||
if ( globalDefault.getCatalog() != null ) {
|
|
||||||
catalog = globalDefault.getCatalog();
|
|
||||||
}
|
|
||||||
if ( globalDefault.getDelimitedIdentifier() != null ) {
|
if ( globalDefault.getDelimitedIdentifier() != null ) {
|
||||||
delimitedIdentifier = globalDefault.getDelimitedIdentifier();
|
delimitedIdentifier = globalDefault.getDelimitedIdentifier();
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import org.hibernate.tool.schema.spi.SchemaManagementTool;
|
||||||
public class DatabaseInformationImpl
|
public class DatabaseInformationImpl
|
||||||
implements DatabaseInformation, ExtractionContext.DatabaseObjectAccess {
|
implements DatabaseInformation, ExtractionContext.DatabaseObjectAccess {
|
||||||
private final JdbcEnvironment jdbcEnvironment;
|
private final JdbcEnvironment jdbcEnvironment;
|
||||||
|
private final SqlStringGenerationContext sqlStringGenerationContext;
|
||||||
private final ExtractionContext extractionContext;
|
private final ExtractionContext extractionContext;
|
||||||
private final InformationExtractor extractor;
|
private final InformationExtractor extractor;
|
||||||
|
|
||||||
|
@ -44,6 +45,7 @@ public class DatabaseInformationImpl
|
||||||
DdlTransactionIsolator ddlTransactionIsolator,
|
DdlTransactionIsolator ddlTransactionIsolator,
|
||||||
SchemaManagementTool tool) throws SQLException {
|
SchemaManagementTool tool) throws SQLException {
|
||||||
this.jdbcEnvironment = jdbcEnvironment;
|
this.jdbcEnvironment = jdbcEnvironment;
|
||||||
|
this.sqlStringGenerationContext = sqlStringGenerationContext;
|
||||||
this.extractionContext = tool.getExtractionTool().createExtractionContext(
|
this.extractionContext = tool.getExtractionTool().createExtractionContext(
|
||||||
serviceRegistry,
|
serviceRegistry,
|
||||||
jdbcEnvironment,
|
jdbcEnvironment,
|
||||||
|
@ -78,12 +80,13 @@ public class DatabaseInformationImpl
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean catalogExists(Identifier catalog) {
|
public boolean catalogExists(Identifier catalog) {
|
||||||
return extractor.catalogExists( catalog );
|
return extractor.catalogExists( sqlStringGenerationContext.catalogWithDefault( catalog ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean schemaExists(Namespace.Name namespace) {
|
public boolean schemaExists(Namespace.Name namespace) {
|
||||||
return extractor.schemaExists( namespace.getCatalog(), namespace.getSchema() );
|
return extractor.schemaExists( sqlStringGenerationContext.catalogWithDefault( namespace.getCatalog() ),
|
||||||
|
sqlStringGenerationContext.schemaWithDefault( namespace.getSchema() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -108,15 +111,16 @@ public class DatabaseInformationImpl
|
||||||
}
|
}
|
||||||
|
|
||||||
return extractor.getTable(
|
return extractor.getTable(
|
||||||
tableName.getCatalogName(),
|
sqlStringGenerationContext.catalogWithDefault( tableName.getCatalogName() ),
|
||||||
tableName.getSchemaName(),
|
sqlStringGenerationContext.schemaWithDefault( tableName.getSchemaName() ),
|
||||||
tableName.getTableName()
|
tableName.getTableName()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public NameSpaceTablesInformation getTablesInformation(Namespace namespace) {
|
public NameSpaceTablesInformation getTablesInformation(Namespace namespace) {
|
||||||
return extractor.getTables( namespace.getPhysicalName().getCatalog(), namespace.getPhysicalName().getSchema() );
|
return extractor.getTables( sqlStringGenerationContext.catalogWithDefault( namespace.getPhysicalName().getCatalog() ),
|
||||||
|
sqlStringGenerationContext.schemaWithDefault( namespace.getPhysicalName().getSchema() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -235,7 +235,8 @@ public class SchemaCreatorImpl implements SchemaCreator {
|
||||||
|
|
||||||
if ( tryToCreateCatalogs ) {
|
if ( tryToCreateCatalogs ) {
|
||||||
final Identifier catalogLogicalName = namespace.getName().getCatalog();
|
final Identifier catalogLogicalName = namespace.getName().getCatalog();
|
||||||
final Identifier catalogPhysicalName = namespace.getPhysicalName().getCatalog();
|
final Identifier catalogPhysicalName =
|
||||||
|
sqlStringGenerationContext.catalogWithDefault( namespace.getPhysicalName().getCatalog() );
|
||||||
|
|
||||||
if ( catalogPhysicalName != null && !exportedCatalogs.contains( catalogLogicalName ) ) {
|
if ( catalogPhysicalName != null && !exportedCatalogs.contains( catalogLogicalName ) ) {
|
||||||
applySqlStrings(
|
applySqlStrings(
|
||||||
|
@ -248,9 +249,11 @@ public class SchemaCreatorImpl implements SchemaCreator {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( tryToCreateSchemas && namespace.getPhysicalName().getSchema() != null ) {
|
final Identifier schemaPhysicalName =
|
||||||
|
sqlStringGenerationContext.schemaWithDefault( namespace.getPhysicalName().getSchema() );
|
||||||
|
if ( tryToCreateSchemas && schemaPhysicalName != null ) {
|
||||||
applySqlStrings(
|
applySqlStrings(
|
||||||
dialect.getCreateSchemaCommand( namespace.getPhysicalName().getSchema().render( dialect ) ),
|
dialect.getCreateSchemaCommand( schemaPhysicalName.render( dialect ) ),
|
||||||
formatter,
|
formatter,
|
||||||
options,
|
options,
|
||||||
targets
|
targets
|
||||||
|
|
|
@ -11,6 +11,7 @@ import org.junit.Test;
|
||||||
|
|
||||||
import org.hibernate.Session;
|
import org.hibernate.Session;
|
||||||
import org.hibernate.Transaction;
|
import org.hibernate.Transaction;
|
||||||
|
import org.hibernate.boot.model.relational.SqlStringGenerationContext;
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
import org.hibernate.dialect.H2Dialect;
|
import org.hibernate.dialect.H2Dialect;
|
||||||
import org.hibernate.id.IdentifierGenerator;
|
import org.hibernate.id.IdentifierGenerator;
|
||||||
|
@ -54,9 +55,10 @@ public class HibernateSequenceTest extends BaseCoreFunctionalTestCase {
|
||||||
IdentifierGenerator generator = persister.getIdentifierGenerator();
|
IdentifierGenerator generator = persister.getIdentifierGenerator();
|
||||||
Assert.assertTrue( SequenceStyleGenerator.class.isInstance( generator ) );
|
Assert.assertTrue( SequenceStyleGenerator.class.isInstance( generator ) );
|
||||||
SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator;
|
SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator;
|
||||||
|
SqlStringGenerationContext sqlStringGenerationContext = sessionFactory().getSqlStringGenerationContext();
|
||||||
Assert.assertEquals(
|
Assert.assertEquals(
|
||||||
SCHEMA_NAME + "." + SequenceStyleGenerator.DEF_SEQUENCE_NAME,
|
SCHEMA_NAME + "." + SequenceStyleGenerator.DEF_SEQUENCE_NAME,
|
||||||
seqGenerator.getDatabaseStructure().getPhysicalName().render()
|
sqlStringGenerationContext.format( seqGenerator.getDatabaseStructure().getPhysicalName() )
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -64,7 +64,9 @@ public class JPAXMLOverriddenAnnotationReaderTest extends BaseUnitTestCase {
|
||||||
);
|
);
|
||||||
assertNotNull( reader.getAnnotation( Table.class ) );
|
assertNotNull( reader.getAnnotation( Table.class ) );
|
||||||
assertEquals( "@Table not overridden", "tbl_admin", reader.getAnnotation( Table.class ).name() );
|
assertEquals( "@Table not overridden", "tbl_admin", reader.getAnnotation( Table.class ).name() );
|
||||||
assertEquals( "Default schema not overridden", "myschema", reader.getAnnotation( Table.class ).schema() );
|
// The default schema is assigned later, when we generate SQL.
|
||||||
|
// See DefaultCatalogAndSchemaTest.
|
||||||
|
assertEquals( "Default schema overridden too soon", "", reader.getAnnotation( Table.class ).schema() );
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Proper @Table.uniqueConstraints", 2,
|
"Proper @Table.uniqueConstraints", 2,
|
||||||
reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length
|
reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length
|
||||||
|
@ -88,7 +90,9 @@ public class JPAXMLOverriddenAnnotationReaderTest extends BaseUnitTestCase {
|
||||||
assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() );
|
assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() );
|
||||||
assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) );
|
assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) );
|
||||||
assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() );
|
assertEquals( "wrong tble name", "tablehilo", reader.getAnnotation( TableGenerator.class ).table() );
|
||||||
assertEquals( "no schema overriding", "myschema", reader.getAnnotation( TableGenerator.class ).schema() );
|
// The default schema is assigned later, when we generate SQL.
|
||||||
|
// See DefaultCatalogAndSchemaTest.
|
||||||
|
assertEquals( "Default schema overridden too soon", "", reader.getAnnotation( TableGenerator.class ).schema() );
|
||||||
|
|
||||||
reader = new JPAXMLOverriddenAnnotationReader( Match.class, context, bootstrapContext );
|
reader = new JPAXMLOverriddenAnnotationReader( Match.class, context, bootstrapContext );
|
||||||
assertNotNull( reader.getAnnotation( Table.class ) );
|
assertNotNull( reader.getAnnotation( Table.class ) );
|
||||||
|
@ -98,10 +102,14 @@ public class JPAXMLOverriddenAnnotationReaderTest extends BaseUnitTestCase {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema()
|
"Java annotation not taken into account", "matchschema", reader.getAnnotation( Table.class ).schema()
|
||||||
);
|
);
|
||||||
assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
|
// The default schema is assigned later, when we generate SQL.
|
||||||
|
// See DefaultCatalogAndSchemaTest.
|
||||||
|
assertEquals( "Default catalog overridden too soon", "", reader.getAnnotation( Table.class ).catalog() );
|
||||||
assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) );
|
assertNotNull( "SecondaryTable swallowed", reader.getAnnotation( SecondaryTables.class ) );
|
||||||
|
// The default schema is assigned later, when we generate SQL.
|
||||||
|
// See DefaultCatalogAndSchemaTest.
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Default schema not taken into account", "myschema",
|
"Default schema not taken into account", "",
|
||||||
reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
|
reader.getAnnotation( SecondaryTables.class ).value()[0].schema()
|
||||||
);
|
);
|
||||||
assertNotNull( reader.getAnnotation( Inheritance.class ) );
|
assertNotNull( reader.getAnnotation( Inheritance.class ) );
|
||||||
|
@ -194,15 +202,14 @@ public class JPAXMLOverriddenAnnotationReaderTest extends BaseUnitTestCase {
|
||||||
assertEquals(
|
assertEquals(
|
||||||
"Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name()
|
"Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name()
|
||||||
);
|
);
|
||||||
assertNotNull( reader.getAnnotation( Table.class ) );
|
// The default schema is assigned later, when we generate SQL.
|
||||||
assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
|
// See DefaultCatalogAndSchemaTest.
|
||||||
assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() );
|
assertNull( "Default schema overridden too soon", reader.getAnnotation( Table.class ) );
|
||||||
|
|
||||||
reader = new JPAXMLOverriddenAnnotationReader( Match.class, context, bootstrapContext );
|
reader = new JPAXMLOverriddenAnnotationReader( Match.class, context, bootstrapContext );
|
||||||
assertNotNull( reader.getAnnotation( Table.class ) );
|
// The default schema is assigned later, when we generate SQL.
|
||||||
assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() );
|
// See DefaultCatalogAndSchemaTest.
|
||||||
assertEquals( "Overriding not taken into account", "myschema", reader.getAnnotation( Table.class ).schema() );
|
assertNull( "Default schema overridden too soon", reader.getAnnotation( Table.class ) );
|
||||||
assertEquals( "Overriding not taken into account", "mycatalog", reader.getAnnotation( Table.class ).catalog() );
|
|
||||||
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
|
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) );
|
||||||
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
|
assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) );
|
||||||
assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
|
assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) );
|
||||||
|
|
Loading…
Reference in New Issue