From 9a9653689e464f01ef9bd5c7cf3181485b333217 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 6 Dec 2021 18:57:42 +0100 Subject: [PATCH 001/256] Change branch name in GitHub actions workflow to 5.6 --- .github/workflows/contributor-build.yml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/contributor-build.yml b/.github/workflows/contributor-build.yml index dbdb5d6e2d9e..e6ccfdb63ed3 100644 --- a/.github/workflows/contributor-build.yml +++ b/.github/workflows/contributor-build.yml @@ -9,12 +9,10 @@ name: Hibernate ORM build on: push: branches: - - 'main' - - 'wip/6.0' + - '5.6' pull_request: branches: - - 'main' - - 'wip/6.0' + - '5.6' jobs: build: name: Java 8 From 77776a6af170c30bcde5eb52dd95e7160f350907 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Tue, 9 Nov 2021 11:43:53 +0100 Subject: [PATCH 002/256] HHH-14211 Switch to using oid for CLOB in PostgreSQL to avoid losing data after vacuumlo --- .../dialect/PostgreSQL81Dialect.java | 2 +- .../test/lob/PostgreSqlLobStringTest.java | 86 ++++++++++--------- migration-guide.adoc | 62 +++++++++++++ 3 files changed, 109 insertions(+), 41 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java index ad4ee3a3eef4..09b8df5cb52a 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/PostgreSQL81Dialect.java @@ -114,7 +114,7 @@ public PostgreSQL81Dialect() { registerColumnType( Types.BINARY, "bytea" ); registerColumnType( Types.LONGVARCHAR, "text" ); registerColumnType( Types.LONGVARBINARY, "bytea" ); - registerColumnType( Types.CLOB, "text" ); + registerColumnType( Types.CLOB, "oid" ); registerColumnType( Types.BLOB, "oid" ); registerColumnType( Types.NUMERIC, "numeric($p, $s)" ); registerColumnType( Types.OTHER, "uuid" ); diff --git a/hibernate-core/src/test/java/org/hibernate/test/lob/PostgreSqlLobStringTest.java b/hibernate-core/src/test/java/org/hibernate/test/lob/PostgreSqlLobStringTest.java index 1ba2ce15d1b4..c521dbdcf269 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/lob/PostgreSqlLobStringTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/lob/PostgreSqlLobStringTest.java @@ -65,9 +65,9 @@ protected void prepareTest() " (?, ?, ?, -1)" )) { int index = 1; - statement.setString(index++, value1); - statement.setString(index++, value2); - statement.setString(index++, value3); + statement.setClob( index++, session.getLobHelper().createClob( value1 ) ); + statement.setClob( index++, session.getLobHelper().createClob( value2 ) ); + statement.setClob( index++, session.getLobHelper().createClob( value3 ) ); assertEquals( 1, statement.executeUpdate() ); } @@ -77,57 +77,63 @@ protected void prepareTest() @Test public void testBadClobDataSavedAsStringFails() { - try { - doInHibernate( this::sessionFactory, session -> { - final Query query = session.createQuery( "from TestEntity" ); + doInHibernate( this::sessionFactory, session -> { + final Query query = session.createQuery( "from TestEntity" ); - final List results = query.list(); + final List results = query.list(); - fail("Exception thrown expected"); - } ); - } - catch (Exception e) { - Exception rootException = (Exception) ExceptionUtil.rootCause( e ); - assertTrue( rootException.getMessage().startsWith( "Bad value for type long" ) ); - } + assertThat( results.size(), is( 1 ) ); + + final TestEntity testEntity = results.get( 0 ); + assertThat( testEntity.getFirstLobField(), is( value1 ) ); + assertThat( testEntity.getSecondLobField(), is( value2 ) ); + final Clob clobField = testEntity.getClobField(); + try { + + assertThat( clobField.getSubString( 1, (int) clobField.length() ), is( value3 ) ); + } + catch (SQLException e) { + fail( e.getMessage() ); + } + } ); } @Test public void testBadClobDataSavedAsStringworksAfterUpdate() { doInHibernate( this::sessionFactory, session -> { - session.doWork( connection -> { - try(Statement statement = connection.createStatement()) { - statement.executeUpdate( - "update test_entity\n" + - "set \n" + - " clobfield = lo_from_bytea(0, cast(clobfield as bytea)),\n" + - " firstlobfield = lo_from_bytea(0, cast(firstlobfield as bytea)),\n" + - " secondlobfield = lo_from_bytea(0, cast(secondlobfield as bytea))" - ); - } - } ); - } ); + session.doWork( connection -> { + try (Statement statement = connection.createStatement()) { + statement.executeUpdate( + "update test_entity\n" + + "set \n" + + " clobfield = lo_from_bytea(0, lo_get(clobfield)),\n" + + " firstlobfield = lo_from_bytea(0, lo_get(firstlobfield)),\n" + + " secondlobfield = lo_from_bytea(0, lo_get(secondlobfield))" + ); + } + } ); + } ); doInHibernate( this::sessionFactory, session -> { - final Query query = session.createQuery( "from TestEntity" ); + final Query query = session.createQuery( "from TestEntity" ); - final List results = query.list(); + final List results = query.list(); - assertThat( results.size(), is( 1 ) ); + assertThat( results.size(), is( 1 ) ); - final TestEntity testEntity = results.get( 0 ); - assertThat( testEntity.getFirstLobField(), is( value1 ) ); - assertThat( testEntity.getSecondLobField(), is( value2 ) ); - final Clob clobField = testEntity.getClobField(); - try { + final TestEntity testEntity = results.get( 0 ); + assertThat( testEntity.getFirstLobField(), is( value1 ) ); + assertThat( testEntity.getSecondLobField(), is( value2 ) ); + final Clob clobField = testEntity.getClobField(); + try { - assertThat( clobField.getSubString( 1, (int) clobField.length() ), is( value3 ) ); - } - catch (SQLException e) { - fail( e.getMessage() ); - } - } ); + assertThat( clobField.getSubString( 1, (int) clobField.length() ), is( value3 ) ); + } + catch (SQLException e) { + fail( e.getMessage() ); + } + } ); } @Entity(name = "TestEntity") diff --git a/migration-guide.adoc b/migration-guide.adoc index fe220a2b9b41..c9bb6396d733 100644 --- a/migration-guide.adoc +++ b/migration-guide.adoc @@ -19,3 +19,65 @@ configure `hibernate.bytecode.provider=javassist`: remove the property if you're A side effect is that Hibenate ORM no longer lists javassist among its dependencies. +=== Changes to the DDL type for CLOB in PostgreSQL81Dialect and its subclasses + +As of 5.6.2, the default PostgreSQL DDL type for CLOB columns i.e. fields annotated with `@Lob` or with the type `java.sql.Clob` +will be the `oid` type whereas before, the type `text` was used. The `text` type does not support streaming data +and is, even if TOASTed, materialized eagerly by the server, which is not what one would expect for LOB types. + +All PostgreSQL JDBC drivers unfortunately just store the `oid` it created for a `java.sql.Clob` into the `text` column. +Although reading back the value with the CLOB API works, PostgreSQL has no knowledge of the reference to the LOB, +because the `oid` is not known to PostgreSQL, leading to data loss when `vacuumlo` (the utility to clean up unused LOBs) runs. +To avoid the data loss, it is required to use the `oid` type so that `vacuumlo` can see the reference. + +Updating to 5.6.2 does not require any schema or application changes by default, but we highly recommend +that you migrate existing `text` columns for LOBs to `oid` to prevent data loss due to the activity of `vacuumlo`. + +[source,sql] +---- +alter table test_entity +alter column clobfield +set data type oid using clobfield::oid +---- + +If you are overriding the `JdbcTypeDescriptor` for `CLOB` to use e.g. `VarcharTypeDescriptor` in a custom PostgreSQL dialect, +beware that you will also have to override the column type in the custom dialect, as with "pgjdbc", +it is not possible to read/write an `oid` column with the JDBC `ResultSet#getString/Statement#setString` methods. + +[source,java] +---- +registerColumnType( Types.CLOB, "text" ); +---- + +Alternatively, you can remove the `JdbcTypeDescriptor` override and migrate to `oid` with + +[source,sql] +---- +alter table test_entity +alter column clobfield +set data type oid using lo_from_bytea(0, cast(clobfield as bytea)) +---- + +The switch to `oid` might have a negative impact on performance for small values that are fetched often, +because the value is stored in a different file system page than the row, even for small values +The benefit of the `oid` type is that it allows streaming the content and reduces the row size. + +Users that just want a large text type but don't care about streaming should use the Hibernate type `text`: + +[source,java] +---- +@Entity +public class TestEntity { + + @org.hibernate.annotations.Type( type = "text" ) + String clobField; + + //... +} +---- + +This will map to `java.sql.Types.LONGVARCHAR` for which Hibernate dialects register a DDL type that supports access +via the `ResultSet#getString/Statement#setString` methods i.e. in case of PostgreSQL the type `text`. + +The `@Lob` annotation should only be used to force the use of the `ResultSet#getClob/Statement#setClob` JDBC driver methods, +which is in turn necessary for streaming data. From 696db954160a13c8aa1317b698badd36d9398fa0 Mon Sep 17 00:00:00 2001 From: "jaehun.lee" Date: Sun, 22 Nov 2020 20:38:39 +0900 Subject: [PATCH 003/256] polishing --- .../persister/entity/AbstractEntityPersister.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index fbd6be954474..8ed6a7e6f52c 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -3297,7 +3297,7 @@ public String getSelectByUniqueKeyString(String propertyName) { .toStatementString(); } - private BasicBatchKey inserBatchKey; + private BasicBatchKey insertBatchKey; /** * Perform an SQL INSERT. @@ -3338,8 +3338,8 @@ public void insert( jdbcBatchSizeToUse > 1 && getIdentifierGenerator().supportsJdbcBatchInserts(); - if ( useBatch && inserBatchKey == null ) { - inserBatchKey = new BasicBatchKey( + if ( useBatch && insertBatchKey == null ) { + insertBatchKey = new BasicBatchKey( getEntityName() + "#INSERT", expectation ); @@ -3352,7 +3352,7 @@ public void insert( if ( useBatch ) { insert = session .getJdbcCoordinator() - .getBatch( inserBatchKey ) + .getBatch(insertBatchKey) .getBatchStatement( sql, callable ); } else { @@ -3372,7 +3372,7 @@ public void insert( dehydrate( id, fields, null, notNull, propertyColumnInsertable, j, insert, session, index, false ); if ( useBatch ) { - session.getJdbcCoordinator().getBatch( inserBatchKey ).addToBatch(); + session.getJdbcCoordinator().getBatch(insertBatchKey).addToBatch(); } else { expectation.verifyOutcome( From 49d2fccbcbb59b13c3224d1a10c4f30e332b8072 Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 6 Dec 2021 19:46:44 +0100 Subject: [PATCH 004/256] Fixup code formatting --- .../hibernate/persister/entity/AbstractEntityPersister.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 8ed6a7e6f52c..afe36eaf65bd 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -3352,7 +3352,7 @@ public void insert( if ( useBatch ) { insert = session .getJdbcCoordinator() - .getBatch(insertBatchKey) + .getBatch( insertBatchKey ) .getBatchStatement( sql, callable ); } else { @@ -3372,7 +3372,7 @@ public void insert( dehydrate( id, fields, null, notNull, propertyColumnInsertable, j, insert, session, index, false ); if ( useBatch ) { - session.getJdbcCoordinator().getBatch(insertBatchKey).addToBatch(); + session.getJdbcCoordinator().getBatch( insertBatchKey ).addToBatch(); } else { expectation.verifyOutcome( From 9d3b3d1c8a71c989fe2168ec7998811939fc56f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 4 Nov 2021 10:38:47 +0100 Subject: [PATCH 005/256] HHH-14921 Clarify the ability of IdentifierGenerator to be configured and to register exportables --- .../InFlightMetadataCollectorImpl.java | 5 +-- .../main/java/org/hibernate/id/Assigned.java | 2 +- .../java/org/hibernate/id/Configurable.java | 3 ++ .../org/hibernate/id/ForeignGenerator.java | 2 +- .../org/hibernate/id/IdentifierGenerator.java | 35 +++++++++++++++++-- .../org/hibernate/id/IncrementGenerator.java | 2 +- .../id/MultipleHiLoPerTableGenerator.java | 3 +- .../id/PersistentIdentifierGenerator.java | 12 ++++--- .../org/hibernate/id/SelectGenerator.java | 2 +- .../org/hibernate/id/SequenceGenerator.java | 2 +- .../java/org/hibernate/id/UUIDGenerator.java | 2 +- .../org/hibernate/id/UUIDHexGenerator.java | 2 +- .../id/enhanced/SequenceStyleGenerator.java | 3 +- .../hibernate/id/enhanced/TableGenerator.java | 3 +- .../DefaultIdentifierGeneratorFactory.java | 5 +-- .../java/org/hibernate/mapping/Component.java | 5 +-- 16 files changed, 57 insertions(+), 31 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java index 568ef9649817..5b780c15eef0 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java @@ -45,7 +45,6 @@ import org.hibernate.boot.model.naming.ImplicitUniqueKeyNameSource; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.model.relational.Database; -import org.hibernate.boot.model.relational.ExportableProducer; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.source.internal.ImplicitColumnNamingSecondPass; @@ -2249,9 +2248,7 @@ private void handleIdentifierValueBinding( entityBinding ); - if ( ig instanceof ExportableProducer ) { - ( (ExportableProducer) ig ).registerExportables( getDatabase() ); - } + ig.registerExportables( getDatabase() ); } catch (MappingException e) { // ignore this for now. The reasoning being "non-reflective" binding as needed diff --git a/hibernate-core/src/main/java/org/hibernate/id/Assigned.java b/hibernate-core/src/main/java/org/hibernate/id/Assigned.java index e22faa0f7df7..cfffdcc2107f 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/Assigned.java +++ b/hibernate-core/src/main/java/org/hibernate/id/Assigned.java @@ -23,7 +23,7 @@ * * @author Gavin King */ -public class Assigned implements IdentifierGenerator, Configurable { +public class Assigned implements IdentifierGenerator { private String entityName; public Serializable generate(SharedSessionContractImplementor session, Object obj) throws HibernateException { diff --git a/hibernate-core/src/main/java/org/hibernate/id/Configurable.java b/hibernate-core/src/main/java/org/hibernate/id/Configurable.java index 7ffdcc970063..87d53fba0dd0 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/Configurable.java +++ b/hibernate-core/src/main/java/org/hibernate/id/Configurable.java @@ -15,11 +15,14 @@ /** * An {@link IdentifierGenerator} that supports "configuration". * + * @deprecated All methods are already defined in {@link IdentifierGenerator}. + * Just implement {@link IdentifierGenerator}. * @see IdentifierGenerator * * @author Gavin King * @author Steve Ebersole */ +@Deprecated public interface Configurable { /** * Configure this instance, given the value of parameters diff --git a/hibernate-core/src/main/java/org/hibernate/id/ForeignGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/ForeignGenerator.java index d7a00d37a9d1..6528d81c133a 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/ForeignGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/ForeignGenerator.java @@ -34,7 +34,7 @@ * * @author Gavin King */ -public class ForeignGenerator implements IdentifierGenerator, Configurable { +public class ForeignGenerator implements IdentifierGenerator { private static final CoreMessageLogger LOG = messageLogger( ForeignGenerator.class ); private String entityName; diff --git a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java index 51bc8a355e5b..ca3da8b32783 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java @@ -7,10 +7,16 @@ package org.hibernate.id; import java.io.Serializable; +import java.util.Properties; import javax.persistence.GeneratedValue; import org.hibernate.HibernateException; +import org.hibernate.MappingException; +import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.ExportableProducer; import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; /** * The general contract between a class that generates unique @@ -29,9 +35,8 @@ * @author Gavin King * * @see PersistentIdentifierGenerator - * @see Configurable */ -public interface IdentifierGenerator { +public interface IdentifierGenerator extends Configurable, ExportableProducer { /** * The configuration parameter holding the entity name */ @@ -48,6 +53,32 @@ public interface IdentifierGenerator { */ String GENERATOR_NAME = "GENERATOR_NAME"; + /** + * Configure this instance, given the value of parameters + * specified by the user as <param> elements. + *

+ * This method is called just once, following instantiation, and before {@link #registerExportables(Database)}. + * + * @param type The id property type descriptor + * @param params param values, keyed by parameter name + * @param serviceRegistry Access to service that may be needed. + * @throws MappingException If configuration fails. + */ + @Override + default void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { + } + + /** + * Register database objects used by this identifier generator, e.g. sequences, tables, etc. + *

+ * This method is called just once, after {@link #configure(Type, Properties, ServiceRegistry)}. + * + * @param database The database instance + */ + @Override + default void registerExportables(Database database) { + } + /** * Generate a new identifier. * diff --git a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java index 68ab1517aae9..6f2261a4deaf 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java @@ -38,7 +38,7 @@ * @author Steve Ebersole * @author Brett Meyer */ -public class IncrementGenerator implements IdentifierGenerator, Configurable { +public class IncrementGenerator implements IdentifierGenerator { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( IncrementGenerator.class ); private Class returnClass; diff --git a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java index 6c7c1000d808..eb891e5ae35c 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java @@ -78,7 +78,7 @@ * @deprecated Use {@link org.hibernate.id.enhanced.TableGenerator} instead. */ @Deprecated -public class MultipleHiLoPerTableGenerator implements PersistentIdentifierGenerator, Configurable { +public class MultipleHiLoPerTableGenerator implements PersistentIdentifierGenerator { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( MultipleHiLoPerTableGenerator.class ); public static final String ID_TABLE = "table"; @@ -253,6 +253,7 @@ private ResultSet executeQuery(PreparedStatement ps, SessionEventListenerManager } } + @Override @SuppressWarnings({"StatementWithEmptyBody", "deprecation"}) public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { returnClass = type.getReturnedClass(); diff --git a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java index 6529124f98a3..cc81847f5178 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java @@ -6,23 +6,25 @@ */ package org.hibernate.id; +import java.util.Properties; + import org.hibernate.HibernateException; -import org.hibernate.boot.model.relational.ExportableProducer; import org.hibernate.dialect.Dialect; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; /** * An IdentifierGenerator that requires creation of database objects. *

- * All PersistentIdentifierGenerators that also implement - * Configurable have access to a special mapping parameter: schema + * All PersistentIdentifierGenerators have access to a special mapping parameter + * in their {@link #configure(Type, Properties, ServiceRegistry)} method: schema * * @author Gavin King * @author Steve Ebersole * * @see IdentifierGenerator - * @see Configurable */ -public interface PersistentIdentifierGenerator extends IdentifierGenerator, ExportableProducer { +public interface PersistentIdentifierGenerator extends IdentifierGenerator { /** * The configuration parameter holding the schema name diff --git a/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java index eb7521309e1b..40c0b0eb667d 100755 --- a/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java @@ -31,7 +31,7 @@ * * @author Gavin King */ -public class SelectGenerator extends AbstractPostInsertGenerator implements Configurable { +public class SelectGenerator extends AbstractPostInsertGenerator { private String uniqueKeyPropertyName; @Override diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java index cf82f58765e9..1f68fa056e54 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java @@ -45,7 +45,7 @@ */ @Deprecated public class SequenceGenerator - implements PersistentIdentifierGenerator, BulkInsertionCapableIdentifierGenerator, Configurable { + implements PersistentIdentifierGenerator, BulkInsertionCapableIdentifierGenerator { private static final Logger LOG = Logger.getLogger( SequenceGenerator.class.getName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java index 0b86ee15cea0..a18597b1fd04 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/UUIDGenerator.java @@ -39,7 +39,7 @@ * * @author Steve Ebersole */ -public class UUIDGenerator implements IdentifierGenerator, Configurable { +public class UUIDGenerator implements IdentifierGenerator { public static final String UUID_GEN_STRATEGY = "uuid_gen_strategy"; public static final String UUID_GEN_STRATEGY_CLASS = "uuid_gen_strategy_class"; diff --git a/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java index a51c6fd9af18..a0370886de30 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/UUIDHexGenerator.java @@ -29,7 +29,7 @@ * * @author Gavin King */ -public class UUIDHexGenerator extends AbstractUUIDGenerator implements Configurable { +public class UUIDHexGenerator extends AbstractUUIDGenerator { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( UUIDHexGenerator.class ); private static boolean WARNED; diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index d3d7de7e5c1e..27b89170adec 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -24,7 +24,6 @@ import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.BulkInsertionCapableIdentifierGenerator; -import org.hibernate.id.Configurable; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.id.SequenceMismatchStrategy; @@ -101,7 +100,7 @@ * @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com) */ public class SequenceStyleGenerator - implements PersistentIdentifierGenerator, BulkInsertionCapableIdentifierGenerator, Configurable { + implements PersistentIdentifierGenerator, BulkInsertionCapableIdentifierGenerator { private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index 5a961091953e..d817777b55f8 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -36,7 +36,6 @@ import org.hibernate.engine.jdbc.spi.SqlStatementLogger; import org.hibernate.engine.spi.SessionEventListenerManager; import org.hibernate.engine.spi.SharedSessionContractImplementor; -import org.hibernate.id.Configurable; import org.hibernate.id.ExportableColumn; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.IdentifierGeneratorHelper; @@ -129,7 +128,7 @@ * * @author Steve Ebersole */ -public class TableGenerator implements PersistentIdentifierGenerator, Configurable { +public class TableGenerator implements PersistentIdentifierGenerator { private static final CoreMessageLogger LOG = Logger.getMessageLogger( CoreMessageLogger.class, TableGenerator.class.getName() diff --git a/hibernate-core/src/main/java/org/hibernate/id/factory/internal/DefaultIdentifierGeneratorFactory.java b/hibernate-core/src/main/java/org/hibernate/id/factory/internal/DefaultIdentifierGeneratorFactory.java index 5d433606e632..b08e65021142 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/factory/internal/DefaultIdentifierGeneratorFactory.java +++ b/hibernate-core/src/main/java/org/hibernate/id/factory/internal/DefaultIdentifierGeneratorFactory.java @@ -19,7 +19,6 @@ import org.hibernate.engine.config.spi.StandardConverters; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.id.Assigned; -import org.hibernate.id.Configurable; import org.hibernate.id.ForeignGenerator; import org.hibernate.id.GUIDGenerator; import org.hibernate.id.IdentifierGenerator; @@ -140,9 +139,7 @@ public boolean useJpaCompliantCreation() { FallbackBeanInstanceProducer.INSTANCE ).getBeanInstance(); } - if ( identifierGenerator instanceof Configurable ) { - ( ( Configurable ) identifierGenerator ).configure( type, config, serviceRegistry ); - } + identifierGenerator.configure( type, config, serviceRegistry ); return identifierGenerator; } catch ( Exception e ) { diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java index af85ad6fbbc5..105d59f50b84 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java @@ -16,7 +16,6 @@ import org.hibernate.EntityMode; import org.hibernate.MappingException; import org.hibernate.boot.model.relational.Database; -import org.hibernate.boot.model.relational.ExportableProducer; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -512,9 +511,7 @@ public void execute(SharedSessionContractImplementor session, Object incomingObj @Override public void registerExportables(Database database) { - if ( ExportableProducer.class.isInstance( subGenerator ) ) { - ( (ExportableProducer) subGenerator ).registerExportables( database ); - } + subGenerator.registerExportables( database ); } } From af5afa988dc02d422d8e1591658dfa3112a50dce Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 4 Nov 2021 13:23:37 +0100 Subject: [PATCH 006/256] HHH-14921 Clarify that org.hibernate.mapping.AuxiliaryDatabaseObject has been replaced with org.hibernate.boot.model.relational.AuxiliaryDatabaseObject --- .../boot/model/relational/AbstractAuxiliaryDatabaseObject.java | 2 +- .../boot/model/source/spi/MetadataSourceProcessor.java | 2 +- .../java/org/hibernate/mapping/AuxiliaryDatabaseObject.java | 3 +++ 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AbstractAuxiliaryDatabaseObject.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AbstractAuxiliaryDatabaseObject.java index 95230353ed09..cf3eb2bb32b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AbstractAuxiliaryDatabaseObject.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AbstractAuxiliaryDatabaseObject.java @@ -13,7 +13,7 @@ import org.hibernate.dialect.Dialect; /** - * Convenience base class for {@link org.hibernate.mapping.AuxiliaryDatabaseObject}s. + * Convenience base class for {@link AuxiliaryDatabaseObject}s. *

* This implementation performs dialect scoping checks strictly based on * dialect name comparisons. Custom implementations might want to do diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/spi/MetadataSourceProcessor.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/spi/MetadataSourceProcessor.java index 4a857b8a7848..d5e651d2ff06 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/spi/MetadataSourceProcessor.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/spi/MetadataSourceProcessor.java @@ -47,7 +47,7 @@ public interface MetadataSourceProcessor { void processNamedQueries(); /** - * Process all {@link org.hibernate.mapping.AuxiliaryDatabaseObject} definitions. + * Process all {@link org.hibernate.boot.model.relational.AuxiliaryDatabaseObject} definitions. *

* This step has no prerequisites. */ diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/AuxiliaryDatabaseObject.java b/hibernate-core/src/main/java/org/hibernate/mapping/AuxiliaryDatabaseObject.java index 22ef534bbdcb..f902bd8bac76 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/AuxiliaryDatabaseObject.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/AuxiliaryDatabaseObject.java @@ -15,7 +15,10 @@ * creating/dropping the schema. * * @author Steve Ebersole + * + * @deprecated Use {@link org.hibernate.boot.model.relational.AuxiliaryDatabaseObject} instead. */ +@Deprecated public interface AuxiliaryDatabaseObject extends RelationalModel, Serializable { /** * Add the given dialect name to the scope of dialects to which From 0bd228a64017293e04ff73f163892ee16e2695ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 4 Nov 2021 14:01:12 +0100 Subject: [PATCH 007/256] HHH-14921 Remove a few unused SQL generation methods in identifier generators They are getting in the way of changes related to the default schema --- .../id/MultipleHiLoPerTableGenerator.java | 16 ------------ .../id/PersistentIdentifierGenerator.java | 26 ------------------- .../org/hibernate/id/SequenceGenerator.java | 11 -------- .../id/enhanced/DatabaseStructure.java | 15 ----------- .../id/enhanced/SequenceStructure.java | 12 --------- .../id/enhanced/SequenceStyleGenerator.java | 11 -------- .../hibernate/id/enhanced/TableGenerator.java | 16 ------------ .../hibernate/id/enhanced/TableStructure.java | 15 ----------- hibernate-envers/hibernate-envers.gradle | 1 + .../enhanced/OrderedSequenceStructure.java | 13 ---------- .../MonotonicRevisionNumberTest.java | 16 ++++++++++-- 11 files changed, 15 insertions(+), 137 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java index eb891e5ae35c..074f6084f6e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java @@ -14,7 +14,6 @@ import java.sql.Types; import java.util.Properties; -import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.MappingException; import org.hibernate.boot.model.naming.Identifier; @@ -22,7 +21,6 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.engine.jdbc.spi.JdbcServices; @@ -377,20 +375,6 @@ public void registerExportables(Database database) { } - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return new String[] { - dialect.getCreateTableString() - + ' ' + tableName + " ( " - + segmentColumnName + ' ' + dialect.getTypeName( Types.VARCHAR, keySize, 0, 0 ) + ", " - + valueColumnName + ' ' + dialect.getTypeName( Types.INTEGER ) - + " )" + dialect.getTableTypeString() - }; - } - - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return new String[] {dialect.getDropTableString( tableName )}; - } - public Object generatorKey() { return tableName; } diff --git a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java index cc81847f5178..fa61f015c4a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java @@ -59,32 +59,6 @@ public interface PersistentIdentifierGenerator extends IdentifierGenerator { */ String IDENTIFIER_NORMALIZER = "identifier_normalizer"; - /** - * The SQL required to create the underlying database objects. - * - * @param dialect The dialect against which to generate the create command(s) - * - * @return The create command(s) - * - * @throws HibernateException problem creating the create command(s) - * @deprecated Utilize the ExportableProducer contract instead - */ - @Deprecated - String[] sqlCreateStrings(Dialect dialect) throws HibernateException; - - /** - * The SQL required to remove the underlying database objects. - * - * @param dialect The dialect against which to generate the drop command(s) - * - * @return The drop command(s) - * - * @throws HibernateException problem creating the drop command(s) - * @deprecated Utilize the ExportableProducer contract instead - */ - @Deprecated - String[] sqlDropStrings(Dialect dialect) throws HibernateException; - /** * Return a key unique to the underlying database objects. Prevents us from * trying to create/remove them multiple times. diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java index 1f68fa056e54..a968f1b2f984 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java @@ -144,17 +144,6 @@ protected IntegralDataTypeHolder buildHolder() { return IdentifierGeneratorHelper.getIntegralDataTypeHolder( identifierType.getReturnedClass() ); } - @Override - @SuppressWarnings( {"deprecation"}) - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return dialect.getCreateSequenceStrings( sequenceName, 1, 1 ); - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return dialect.getDropSequenceStrings( sequenceName ); - } - @Override public boolean supportsBulkInsertionIdentifierGeneration() { return true; diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java index 2e256864c94f..dcb907e14fde 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java @@ -7,7 +7,6 @@ package org.hibernate.id.enhanced; import org.hibernate.boot.model.relational.ExportableProducer; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; /** @@ -58,20 +57,6 @@ public interface DatabaseStructure extends ExportableProducer { */ void prepare(Optimizer optimizer); - /** - * Commands needed to create the underlying structures. - * @param dialect The database dialect being used. - * @return The creation commands. - */ - String[] sqlCreateStrings(Dialect dialect); - - /** - * Commands needed to drop the underlying structures. - * @param dialect The database dialect being used. - * @return The drop commands. - */ - String[] sqlDropStrings(Dialect dialect); - /** * Is the structure physically a sequence? * diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java index b32ce3d9682d..ed0e9be86c40 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java @@ -11,12 +11,10 @@ import java.sql.SQLException; import org.hibernate.AssertionFailure; -import org.hibernate.HibernateException; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.Sequence; -import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.IdentifierGeneratorHelper; @@ -144,16 +142,6 @@ public void registerExportables(Database database) { this.sql = database.getJdbcEnvironment().getDialect().getSequenceNextValString( sequenceName ); } - @Override - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return dialect.getCreateSequenceStrings( sequenceName, initialValue, getSourceIncrementSize() ); - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return dialect.getDropSequenceStrings( sequenceName ); - } - @Override public boolean isPhysicalSequence() { return true; diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index 27b89170adec..ae7bccc19ebc 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -12,7 +12,6 @@ import org.hibernate.HibernateException; import org.hibernate.MappingException; -import org.hibernate.boot.SchemaAutoTooling; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedName; @@ -532,16 +531,6 @@ public Object generatorKey() { return databaseStructure.getName(); } - @Override - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return databaseStructure.sqlCreateStrings( dialect ); - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return databaseStructure.sqlDropStrings( dialect ); - } - // BulkInsertionCapableIdentifierGenerator implementation ~~~~~~~~~~~~~~~~~ diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index d817777b55f8..c557d209a973 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -16,7 +16,6 @@ import java.util.Map; import java.util.Properties; -import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.LockOptions; import org.hibernate.MappingException; @@ -708,21 +707,6 @@ private ResultSet executeQuery(PreparedStatement ps, SessionEventListenerManager } } - @Override - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return new String[] { - dialect.getCreateTableString() + ' ' + renderedTableName + " ( " - + segmentColumnName + ' ' + dialect.getTypeName( Types.VARCHAR, segmentValueLength, 0, 0 ) + " not null " - + ", " + valueColumnName + ' ' + dialect.getTypeName( Types.BIGINT ) - + ", primary key ( " + segmentColumnName + " ) )" + dialect.getTableTypeString() - }; - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return new String[] { dialect.getDropTableString( renderedTableName ) }; - } - @Override public void registerExportables(Database database) { final Dialect dialect = database.getJdbcEnvironment().getDialect(); diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java index 5a2d5420df90..38a82558adf7 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java @@ -10,10 +10,8 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Types; import org.hibernate.AssertionFailure; -import org.hibernate.HibernateException; import org.hibernate.LockMode; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Database; @@ -220,19 +218,6 @@ private ResultSet executeQuery(PreparedStatement ps, SessionEventListenerManager } } - @Override - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - return new String[] { - dialect.getCreateTableString() + " " + tableNameText + " ( " + valueColumnNameText + " " + dialect.getTypeName( Types.BIGINT ) + " )", - "insert into " + tableNameText + " values ( " + initialValue + " )" - }; - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - return new String[] { dialect.getDropTableString( tableNameText ) }; - } - @Override public boolean isPhysicalSequence() { return false; diff --git a/hibernate-envers/hibernate-envers.gradle b/hibernate-envers/hibernate-envers.gradle index f168ec015af4..9c6f594d2c42 100644 --- a/hibernate-envers/hibernate-envers.gradle +++ b/hibernate-envers/hibernate-envers.gradle @@ -21,6 +21,7 @@ dependencies { testCompile( project( ':hibernate-testing' ) ) testCompile( project( path: ':hibernate-core', configuration: 'tests' ) ) + testCompile( libraries.assertj ) } sourceSets { diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java index 4cdfa70e55e0..82c3d26c91a5 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java @@ -6,7 +6,6 @@ */ package org.hibernate.envers.enhanced; -import org.hibernate.HibernateException; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedName; @@ -36,18 +35,6 @@ public OrderedSequenceStructure( this.sequenceObject = new OrderedSequence(); } - @Override - public String[] sqlCreateStrings(Dialect dialect) throws HibernateException { - // delegate to auxiliary object - return sequenceObject.sqlCreateStrings( dialect ); - } - - @Override - public String[] sqlDropStrings(Dialect dialect) throws HibernateException { - // delegate to auxiliary object - return sequenceObject.sqlDropStrings( dialect ); - } - @Override protected void buildSequence(Database database) { database.addAuxiliaryDatabaseObject( sequenceObject ); diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java index 6b9274973d96..e04e094183a5 100644 --- a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java @@ -6,6 +6,12 @@ */ package org.hibernate.envers.test.integration.reventity; +import static org.assertj.core.api.Assertions.assertThat; + +import java.util.Optional; + +import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; +import org.hibernate.boot.model.relational.Database; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.envers.enhanced.OrderedSequenceGenerator; import org.hibernate.envers.enhanced.SequenceIdRevisionEntity; @@ -35,10 +41,16 @@ public void testOracleSequenceOrder() { EntityPersister persister = sessionFactory().getEntityPersister( SequenceIdRevisionEntity.class.getName() ); IdentifierGenerator generator = persister.getIdentifierGenerator(); Assert.assertTrue( OrderedSequenceGenerator.class.isInstance( generator ) ); - OrderedSequenceGenerator seqGenerator = (OrderedSequenceGenerator) generator; + + Database database = metadata().getDatabase(); + Optional sequenceOptional = database.getAuxiliaryDatabaseObjects().stream() + .filter( o -> "REVISION_GENERATOR".equals( o.getExportIdentifier() ) ) + .findFirst(); + assertThat( sequenceOptional ).isPresent(); + String[] sqlCreateStrings = sequenceOptional.get().sqlCreateStrings( database.getDialect() ); Assert.assertTrue( "Oracle sequence needs to be ordered in RAC environment.", - seqGenerator.sqlCreateStrings( getDialect() )[0].toLowerCase().endsWith( " order" ) + sqlCreateStrings[0].toLowerCase().endsWith( " order" ) ); } } From 9a14200ca2028f005cd129989004bfef1e52c843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 4 Nov 2021 14:31:04 +0100 Subject: [PATCH 008/256] HHH-14921 Remove unused method PersistentIdentifierGenerator#generatorKey --- .../org/hibernate/id/MultipleHiLoPerTableGenerator.java | 3 --- .../org/hibernate/id/PersistentIdentifierGenerator.java | 8 -------- .../main/java/org/hibernate/id/SequenceGenerator.java | 4 ---- .../hibernate/id/enhanced/SequenceStyleGenerator.java | 9 --------- .../java/org/hibernate/id/enhanced/TableGenerator.java | 5 ----- 5 files changed, 29 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java index 074f6084f6e5..3b09e2ce92cc 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java @@ -375,7 +375,4 @@ public void registerExportables(Database database) { } - public Object generatorKey() { - return tableName; - } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java index fa61f015c4a1..4a129711e4ab 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/PersistentIdentifierGenerator.java @@ -58,12 +58,4 @@ public interface PersistentIdentifierGenerator extends IdentifierGenerator { * The key under which to find the {@link org.hibernate.boot.model.naming.ObjectNameNormalizer} in the config param map. */ String IDENTIFIER_NORMALIZER = "identifier_normalizer"; - - /** - * Return a key unique to the underlying database objects. Prevents us from - * trying to create/remove them multiple times. - * - * @return Object an identifying key for this generator - */ - Object generatorKey(); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java index a968f1b2f984..636ee383f0c2 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java @@ -73,10 +73,6 @@ protected Type getIdentifierType() { return identifierType; } - public Object generatorKey() { - return getSequenceName(); - } - public String getSequenceName() { return sequenceName; } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index ae7bccc19ebc..75fe27ae5ea4 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -523,15 +523,6 @@ public Serializable generate(SharedSessionContractImplementor session, Object ob return optimizer.generate( databaseStructure.buildCallback( session ) ); } - - // PersistentIdentifierGenerator implementation ~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - @Override - public Object generatorKey() { - return databaseStructure.getName(); - } - - // BulkInsertionCapableIdentifierGenerator implementation ~~~~~~~~~~~~~~~~~ @Override diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index c557d209a973..a80f334037da 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -248,11 +248,6 @@ public class TableGenerator implements PersistentIdentifierGenerator { private Optimizer optimizer; private long accessCount; - @Override - public Object generatorKey() { - return qualifiedTableName.render(); - } - /** * Type mapping for the identifier. * From 5b83edfd49f8df348b2356978837d44342df5f8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 4 Nov 2021 17:55:55 +0100 Subject: [PATCH 009/256] HHH-14921 Delay generation of SQL strings by identifier generators until schema export or session factory creation --- .../relational/AuxiliaryDatabaseObject.java | 34 +++++++- .../SqlStringGenerationContext.java | 48 ++++++++++ .../SqlStringGenerationContextImpl.java | 52 +++++++++++ .../identity/GetGeneratedKeysDelegate.java | 3 +- .../spi/SessionFactoryDelegatingImpl.java | 6 ++ .../engine/spi/SessionFactoryImplementor.java | 3 + .../hql/internal/ast/HqlSqlWalker.java | 2 +- .../id/AbstractPostInsertGenerator.java | 3 +- ...lkInsertionCapableIdentifierGenerator.java | 4 +- ...ompositeNestedGeneratedValueGenerator.java | 21 +++++ .../org/hibernate/id/IdentifierGenerator.java | 11 +++ .../org/hibernate/id/IdentityGenerator.java | 5 +- .../org/hibernate/id/IncrementGenerator.java | 49 ++++++++--- .../id/MultipleHiLoPerTableGenerator.java | 25 +++--- .../id/PostInsertIdentifierGenerator.java | 1 + .../org/hibernate/id/SelectGenerator.java | 5 +- .../org/hibernate/id/SequenceGenerator.java | 28 +++--- .../id/SequenceIdentityGenerator.java | 17 ++-- .../id/enhanced/DatabaseStructure.java | 50 ++++++++++- .../id/enhanced/SequenceStructure.java | 20 +++-- .../id/enhanced/SequenceStyleGenerator.java | 22 +++-- .../hibernate/id/enhanced/TableGenerator.java | 39 +++++---- .../hibernate/id/enhanced/TableStructure.java | 48 +++++----- .../InsertGeneratedIdentifierDelegate.java | 4 +- .../internal/SessionFactoryImpl.java | 11 ++- .../java/org/hibernate/mapping/Component.java | 6 ++ .../java/org/hibernate/mapping/Table.java | 26 ++++-- .../AbstractCollectionPersister.java | 1 + .../entity/AbstractEntityPersister.java | 7 +- .../schema/internal/SchemaDropperImpl.java | 7 +- ...andardAuxiliaryDatabaseObjectExporter.java | 5 +- .../internal/StandardTableExporter.java | 10 ++- .../hibernate/tool/schema/spi/Exporter.java | 1 + .../SequenceHiLoGeneratorNoIncrementTest.java | 1 + .../id/SequenceHiLoGeneratorTest.java | 1 + ...HiloGeneratorWitZeroIncrementSizeTest.java | 1 + .../enhanced/SequenceStyleConfigUnitTest.java | 87 ++++++++++--------- .../NewGeneratorMappingsTest.java | 10 ++- .../id/sequences/HibernateSequenceTest.java | 3 +- .../enhanced/auto/NewGeneratorsTests.java | 4 +- .../enhanced/sequence/BasicSequenceTest.java | 3 +- .../HiLoSequenceMismatchStrategyTest.java | 5 +- .../tck2_2/GeneratedValueTests.java | 22 +++-- .../SchemaUpdateTableBackedSequenceTest.java | 6 +- .../enhanced/OrderedSequenceStructure.java | 18 ++-- 45 files changed, 527 insertions(+), 208 deletions(-) create mode 100644 hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java create mode 100644 hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AuxiliaryDatabaseObject.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AuxiliaryDatabaseObject.java index 7434c0772afd..60c54fcb334b 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AuxiliaryDatabaseObject.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/AuxiliaryDatabaseObject.java @@ -39,14 +39,40 @@ public interface AuxiliaryDatabaseObject extends Exportable, Serializable { */ public boolean beforeTablesOnCreation(); + /** + * Gets the SQL strings for creating the database object. + * + * @param context A context to help generate the SQL creation strings + * + * @return the SQL strings for creating the database object. + */ + default String[] sqlCreateStrings(SqlStringGenerationContext context) { + return sqlCreateStrings( context.getDialect() ); + } + /** * Gets the SQL strings for creating the database object. * * @param dialect The dialect for which to generate the SQL creation strings * * @return the SQL strings for creating the database object. + * @deprecated Implement {@link #sqlCreateStrings(SqlStringGenerationContext)} instead. + */ + @Deprecated + default String[] sqlCreateStrings(Dialect dialect) { + throw new IllegalStateException( this + " does not implement sqlCreateStrings(...)" ); + } + + /** + * Gets the SQL strings for dropping the database object. + * + * @param context A context to help generate the SQL drop strings + * + * @return the SQL strings for dropping the database object. */ - public String[] sqlCreateStrings(Dialect dialect); + default String[] sqlDropStrings(SqlStringGenerationContext context) { + return sqlDropStrings( context.getDialect() ); + } /** * Gets the SQL strings for dropping the database object. @@ -54,8 +80,12 @@ public interface AuxiliaryDatabaseObject extends Exportable, Serializable { * @param dialect The dialect for which to generate the SQL drop strings * * @return the SQL strings for dropping the database object. + * @deprecated Implement {@link #sqlDropStrings(SqlStringGenerationContext)} instead. */ - public String[] sqlDropStrings(Dialect dialect); + @Deprecated + default String[] sqlDropStrings(Dialect dialect) { + throw new IllegalStateException( this + " does not implement sqlDropStrings(...)" ); + } /** * Additional, optional interface for AuxiliaryDatabaseObject that want to allow diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java new file mode 100644 index 000000000000..9daa2271a94b --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java @@ -0,0 +1,48 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.boot.model.relational; + +import org.hibernate.dialect.Dialect; + +/** + * A context provided to methods responsible for generating SQL strings on startup. + */ +public interface SqlStringGenerationContext { + + /** + * @return The database dialect, to generate SQL fragments that are specific to each vendor. + */ + Dialect getDialect(); + + /** + * Render a formatted a table name + * + * @param qualifiedName The table name + * + * @return The formatted name, + */ + String format(QualifiedTableName qualifiedName); + + /** + * Render a formatted sequence name + * + * @param qualifiedName The sequence name + * + * @return The formatted name + */ + String format(QualifiedSequenceName qualifiedName); + + /** + * Render a formatted non-table and non-sequence qualified name + * + * @param qualifiedName The name + * + * @return The formatted name + */ + String format(QualifiedName qualifiedName); + +} diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java new file mode 100644 index 000000000000..83b39a0efaee --- /dev/null +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java @@ -0,0 +1,52 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.boot.model.relational.internal; + +import org.hibernate.boot.model.relational.QualifiedName; +import org.hibernate.boot.model.relational.QualifiedSequenceName; +import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter; + +public class SqlStringGenerationContextImpl + implements SqlStringGenerationContext { + + public static SqlStringGenerationContext forTests(JdbcEnvironment jdbcEnvironment) { + return new SqlStringGenerationContextImpl( jdbcEnvironment ); + } + + private final Dialect dialect; + private final QualifiedObjectNameFormatter qualifiedObjectNameFormatter; + + public SqlStringGenerationContextImpl(JdbcEnvironment jdbcEnvironment) { + this.dialect = jdbcEnvironment.getDialect(); + this.qualifiedObjectNameFormatter = jdbcEnvironment.getQualifiedObjectNameFormatter(); + } + + @Override + public Dialect getDialect() { + return dialect; + } + + @Override + public String format(QualifiedTableName qualifiedName) { + return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); + } + + @Override + public String format(QualifiedSequenceName qualifiedName) { + return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); + } + + @Override + public String format(QualifiedName qualifiedName) { + return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); + } + +} diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/identity/GetGeneratedKeysDelegate.java b/hibernate-core/src/main/java/org/hibernate/dialect/identity/GetGeneratedKeysDelegate.java index 38cc8e323c47..ef4c6e389640 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/identity/GetGeneratedKeysDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/identity/GetGeneratedKeysDelegate.java @@ -11,6 +11,7 @@ import java.sql.ResultSet; import java.sql.SQLException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.IdentifierGeneratorHelper; @@ -37,7 +38,7 @@ public GetGeneratedKeysDelegate(PostInsertIdentityPersister persister, Dialect d } @Override - public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() { + public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context) { IdentifierGeneratingInsert insert = new IdentifierGeneratingInsert( dialect ); insert.addIdentityColumn( persister.getRootTableKeyColumnNames()[0] ); return insert; diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java index 349e28f9fce8..e5269956c261 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryDelegatingImpl.java @@ -30,6 +30,7 @@ import org.hibernate.StatelessSession; import org.hibernate.StatelessSessionBuilder; import org.hibernate.TypeHelper; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cache.spi.CacheImplementor; import org.hibernate.cfg.Settings; @@ -244,6 +245,11 @@ public JdbcServices getJdbcServices() { return delegate.getJdbcServices(); } + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return delegate.getSqlStringGenerationContext(); + } + @Override public Dialect getDialect() { return delegate.getDialect(); diff --git a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java index 0a78018a4f1d..ddbab41b53e1 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/spi/SessionFactoryImplementor.java @@ -21,6 +21,7 @@ import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.SessionFactoryObserver; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cache.spi.CacheImplementor; import org.hibernate.cfg.Settings; @@ -298,6 +299,8 @@ default Dialect getDialect() { return getJdbcServices().getDialect(); } + SqlStringGenerationContext getSqlStringGenerationContext(); + /** * Retrieves the SQLExceptionConverter in effect for this SessionFactory. * diff --git a/hibernate-core/src/main/java/org/hibernate/hql/internal/ast/HqlSqlWalker.java b/hibernate-core/src/main/java/org/hibernate/hql/internal/ast/HqlSqlWalker.java index 73b7d6afecba..4174070e6fb4 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/internal/ast/HqlSqlWalker.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/internal/ast/HqlSqlWalker.java @@ -897,7 +897,7 @@ protected void postProcessInsert(AST insert) throws SemanticException, QueryExce } final String fragment = capableGenerator.determineBulkInsertionIdentifierGenerationSelectFragment( - sessionFactoryHelper.getFactory().getDialect() + sessionFactoryHelper.getFactory().getSqlStringGenerationContext() ); if ( fragment != null ) { // we got a fragment from the generator, so alter the sql tree... diff --git a/hibernate-core/src/main/java/org/hibernate/id/AbstractPostInsertGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/AbstractPostInsertGenerator.java index ca57bc0dd3c9..1e0ba78e2af1 100755 --- a/hibernate-core/src/main/java/org/hibernate/id/AbstractPostInsertGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/AbstractPostInsertGenerator.java @@ -8,6 +8,7 @@ import java.io.Serializable; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -29,7 +30,7 @@ public boolean supportsBulkInsertionIdentifierGeneration() { } @Override - public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect dialect) { + public String determineBulkInsertionIdentifierGenerationSelectFragment(SqlStringGenerationContext context) { return null; } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/BulkInsertionCapableIdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/BulkInsertionCapableIdentifierGenerator.java index c3baa8b84460..371b8d0f7735 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/BulkInsertionCapableIdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/BulkInsertionCapableIdentifierGenerator.java @@ -6,7 +6,7 @@ */ package org.hibernate.id; -import org.hibernate.dialect.Dialect; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; /** * Specialized contract for {@link IdentifierGenerator} implementations capable of being used in conjunction @@ -32,5 +32,5 @@ public interface BulkInsertionCapableIdentifierGenerator extends IdentifierGener * * @return The identifier value generation fragment (SQL). {@code null} indicates that no fragment is needed. */ - public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect dialect); + public String determineBulkInsertionIdentifierGenerationSelectFragment(SqlStringGenerationContext context); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/CompositeNestedGeneratedValueGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/CompositeNestedGeneratedValueGenerator.java index 4b45876a8e73..dd730989aea5 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/CompositeNestedGeneratedValueGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/CompositeNestedGeneratedValueGenerator.java @@ -9,11 +9,15 @@ import java.io.Serializable; import java.util.ArrayList; import java.util.List; +import java.util.Properties; import org.hibernate.HibernateException; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.ExportableProducer; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; +import org.hibernate.service.ServiceRegistry; +import org.hibernate.type.Type; /** * For composite identifiers, defines a number of "nested" generations that @@ -67,6 +71,16 @@ public interface GenerationContextLocator { * determined {@link GenerationContextLocator#locateGenerationContext context} */ public interface GenerationPlan extends ExportableProducer { + + /** + * Initializes this instance, in particular pre-generates SQL as necessary. + *

+ * This method is called after {@link #registerExportables(Database)}, before first use. + * + * @param context A context to help generate SQL strings + */ + void initialize(SqlStringGenerationContext context); + /** * Execute the value generation. * @@ -106,4 +120,11 @@ public void registerExportables(Database database) { plan.registerExportables( database ); } } + + @Override + public void initialize(SqlStringGenerationContext context) { + for (GenerationPlan plan : generationPlans) { + plan.initialize( context ); + } + } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java index ca3da8b32783..41207aab4e7f 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IdentifierGenerator.java @@ -14,6 +14,7 @@ import org.hibernate.MappingException; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.ExportableProducer; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.service.ServiceRegistry; import org.hibernate.type.Type; @@ -79,6 +80,16 @@ default void configure(Type type, Properties params, ServiceRegistry serviceRegi default void registerExportables(Database database) { } + /** + * Initializes this instance, in particular pre-generates SQL as necessary. + *

+ * This method is called after {@link #registerExportables(Database)}, before first use. + * + * @param context A context to help generate SQL strings + */ + default void initialize(SqlStringGenerationContext context) { + } + /** * Generate a new identifier. * diff --git a/hibernate-core/src/main/java/org/hibernate/id/IdentityGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IdentityGenerator.java index cb42f197b7d5..5b3e307c8135 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IdentityGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IdentityGenerator.java @@ -13,6 +13,7 @@ import org.hibernate.AssertionFailure; import org.hibernate.HibernateException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.insert.AbstractReturningDelegate; @@ -67,7 +68,7 @@ public InsertSelectDelegate(PostInsertIdentityPersister persister, Dialect diale } @Override - public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() { + public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context) { InsertSelectIdentityInsert insert = new InsertSelectIdentityInsert( dialect ); insert.addIdentityColumn( persister.getRootTableKeyColumnNames()[0] ); return insert; @@ -120,7 +121,7 @@ public BasicDelegate(PostInsertIdentityPersister persister, Dialect dialect) { } @Override - public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() { + public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context) { IdentifierGeneratingInsert insert = new IdentifierGeneratingInsert( dialect ); insert.addIdentityColumn( persister.getRootTableKeyColumnNames()[0] ); return insert; diff --git a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java index 6f2261a4deaf..4a3ca87b6549 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java @@ -10,11 +10,17 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; import java.util.Properties; import org.hibernate.HibernateException; import org.hibernate.MappingException; +import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.naming.ObjectNameNormalizer; +import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.CoreLogging; @@ -42,6 +48,8 @@ public class IncrementGenerator implements IdentifierGenerator { private static final CoreMessageLogger LOG = CoreLogging.messageLogger( IncrementGenerator.class ); private Class returnClass; + private String column; + private List physicalTableNames; private String sql; private IntegralDataTypeHolder previousValueHolder; @@ -62,17 +70,13 @@ public void configure(Type type, Properties params, ServiceRegistry serviceRegis final ObjectNameNormalizer normalizer = (ObjectNameNormalizer) params.get( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER ); - String column = params.getProperty( "column" ); + column = params.getProperty( "column" ); if ( column == null ) { column = params.getProperty( PersistentIdentifierGenerator.PK ); } column = normalizer.normalizeIdentifierQuoting( column ).render( jdbcEnvironment.getDialect() ); - String tableList = params.getProperty( "tables" ); - if ( tableList == null ) { - tableList = params.getProperty( PersistentIdentifierGenerator.TABLES ); - } - String[] tables = StringHelper.split( ", ", tableList ); + IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); final String schema = normalizer.toDatabaseIdentifierText( params.getProperty( PersistentIdentifierGenerator.SCHEMA ) @@ -81,23 +85,40 @@ public void configure(Type type, Properties params, ServiceRegistry serviceRegis params.getProperty( PersistentIdentifierGenerator.CATALOG ) ); + String tableList = params.getProperty( "tables" ); + if ( tableList == null ) { + tableList = params.getProperty( PersistentIdentifierGenerator.TABLES ); + } + physicalTableNames = new ArrayList<>(); + for ( String tableName : StringHelper.split( ", ", tableList ) ) { + physicalTableNames.add( new QualifiedTableName( identifierHelper.toIdentifier( catalog ), + identifierHelper.toIdentifier( schema ), identifierHelper.toIdentifier( tableName ) ) ); + } + } + + @Override + public void initialize(SqlStringGenerationContext context) { StringBuilder buf = new StringBuilder(); - for ( int i = 0; i < tables.length; i++ ) { - final String tableName = normalizer.toDatabaseIdentifierText( tables[i] ); - if ( tables.length > 1 ) { + for ( int i = 0; i < physicalTableNames.size(); i++ ) { + final String tableName = context.format( physicalTableNames.get( i ) ); + if ( physicalTableNames.size() > 1 ) { buf.append( "select max(" ).append( column ).append( ") as mx from " ); } - buf.append( Table.qualify( catalog, schema, tableName ) ); - if ( i < tables.length - 1 ) { + buf.append( tableName ); + if ( i < physicalTableNames.size() - 1 ) { buf.append( " union " ); } } - if ( tables.length > 1 ) { + String maxColumn; + if ( physicalTableNames.size() > 1 ) { buf.insert( 0, "( " ).append( " ) ids_" ); - column = "ids_.mx"; + maxColumn = "ids_.mx"; + } + else { + maxColumn = column; } - sql = "select max(" + column + ") from " + buf.toString(); + sql = "select max(" + maxColumn + ") from " + buf.toString(); } private void initializePreviousValueHolder(SharedSessionContractImplementor session) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java index 3b09e2ce92cc..ea617988cfdb 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/MultipleHiLoPerTableGenerator.java @@ -21,6 +21,7 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.engine.jdbc.spi.JdbcServices; @@ -91,7 +92,7 @@ public class MultipleHiLoPerTableGenerator implements PersistentIdentifierGenera private static final String DEFAULT_VALUE_COLUMN = "sequence_next_hi_value"; private QualifiedName qualifiedTableName; - private String tableName; + private QualifiedName physicalTableName; private String segmentColumnName; private String segmentName; private String valueColumnName; @@ -175,7 +176,7 @@ public IntegralDataTypeHolder execute(Connection connection) throws SQLException rows = executeUpdate( updatePreparedStatement, statsCollector ); } catch (SQLException sqle) { - LOG.error( LOG.unableToUpdateHiValue( tableName ), sqle ); + LOG.error( LOG.unableToUpdateHiValue( physicalTableName.render() ), sqle ); throw sqle; } finally { @@ -340,23 +341,23 @@ public void registerExportables(Database database) { table.addColumn( valueColumn ); } - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); - // allow physical naming strategies a chance to kick in - tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - jdbcEnvironment.getDialect() - ); + physicalTableName = table.getQualifiedTableName(); + } + + @Override + public void initialize(SqlStringGenerationContext context) { + String formattedPhysicalTableName = context.format( physicalTableName ); query = "select " + valueColumnName + " from " + - jdbcEnvironment.getDialect().appendLockHint( LockMode.PESSIMISTIC_WRITE, tableName ) + + context.getDialect().appendLockHint( LockMode.PESSIMISTIC_WRITE, formattedPhysicalTableName ) + " where " + segmentColumnName + " = '" + segmentName + "'" + - jdbcEnvironment.getDialect().getForUpdateString(); + context.getDialect().getForUpdateString(); update = "update " + - tableName + + formattedPhysicalTableName + " set " + valueColumnName + " = ? where " + @@ -367,7 +368,7 @@ public void registerExportables(Database database) { segmentName + "'"; - insert = "insert into " + tableName + + insert = "insert into " + formattedPhysicalTableName + "(" + segmentColumnName + ", " + valueColumnName + ") " + "values('" + segmentName + "', ?)"; diff --git a/hibernate-core/src/main/java/org/hibernate/id/PostInsertIdentifierGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/PostInsertIdentifierGenerator.java index d23d86f2386f..8fc44924aafa 100755 --- a/hibernate-core/src/main/java/org/hibernate/id/PostInsertIdentifierGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/PostInsertIdentifierGenerator.java @@ -7,6 +7,7 @@ package org.hibernate.id; import org.hibernate.HibernateException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.id.insert.InsertGeneratedIdentifierDelegate; diff --git a/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java index 40c0b0eb667d..76925c9d2efa 100755 --- a/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SelectGenerator.java @@ -14,6 +14,7 @@ import org.hibernate.HibernateException; import org.hibernate.MappingException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.insert.AbstractSelectingDelegate; @@ -39,6 +40,7 @@ public void configure(Type type, Properties params, ServiceRegistry serviceRegis uniqueKeyPropertyName = params.getProperty( "key" ); } + @Override public InsertGeneratedIdentifierDelegate getInsertGeneratedIdentifierDelegate( PostInsertIdentityPersister persister, Dialect dialect, @@ -102,7 +104,8 @@ private SelectGeneratorDelegate( idType = persister.getIdentifierType(); } - public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() { + @Override + public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context) { return new IdentifierGeneratingInsert( dialect ); } diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java index 636ee383f0c2..4058c906f2b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java @@ -12,7 +12,6 @@ import java.sql.SQLException; import java.util.Properties; -import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.boot.model.naming.ObjectNameNormalizer; import org.hibernate.boot.model.relational.Database; @@ -20,8 +19,7 @@ import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; import org.hibernate.boot.model.relational.Sequence; -import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.internal.log.DeprecationLogger; import org.hibernate.internal.util.config.ConfigurationHelper; @@ -65,7 +63,7 @@ public class SequenceGenerator public static final String PARAMETERS = "parameters"; private QualifiedName logicalQualifiedSequenceName; - private String sequenceName; + private QualifiedName physicalSequenceName; private Type identifierType; private String sql; @@ -73,8 +71,8 @@ protected Type getIdentifierType() { return identifierType; } - public String getSequenceName() { - return sequenceName; + public QualifiedName getPhysicalSequenceName() { + return physicalSequenceName; } @Override @@ -146,8 +144,8 @@ public boolean supportsBulkInsertionIdentifierGeneration() { } @Override - public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect dialect) { - return dialect.getSelectSequenceNextValString( getSequenceName() ); + public String determineBulkInsertionIdentifierGenerationSelectFragment(SqlStringGenerationContext context) { + return context.getDialect().getSelectSequenceNextValString( context.format( getPhysicalSequenceName() ) ); } @Override @@ -167,14 +165,12 @@ public void registerExportables(Database database) { 1 ); } + this.physicalSequenceName = sequence.getName(); + } - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); - final Dialect dialect = jdbcEnvironment.getDialect(); - - this.sequenceName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - sequence.getName(), - dialect - ); - this.sql = jdbcEnvironment.getDialect().getSequenceNextValString( sequenceName ); + @Override + public void initialize(SqlStringGenerationContext context) { + String formattedPhysicalSequenceName = context.format( physicalSequenceName ); + this.sql = context.getDialect().getSequenceNextValString( formattedPhysicalSequenceName ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceIdentityGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceIdentityGenerator.java index b6ff0c2e3c7b..86d48a4a729e 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceIdentityGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceIdentityGenerator.java @@ -13,6 +13,8 @@ import org.hibernate.HibernateException; import org.hibernate.MappingException; +import org.hibernate.boot.model.relational.QualifiedName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.insert.AbstractReturningDelegate; @@ -55,7 +57,7 @@ public InsertGeneratedIdentifierDelegate getInsertGeneratedIdentifierDelegate( PostInsertIdentityPersister persister, Dialect dialect, boolean isGetGeneratedKeysEnabled) throws HibernateException { - return new Delegate( persister, dialect, getSequenceName() ); + return new Delegate( persister, getPhysicalSequenceName() ); } @Override @@ -64,22 +66,23 @@ public void configure(Type type, Properties params, ServiceRegistry serviceRegis } public static class Delegate extends AbstractReturningDelegate { - private final Dialect dialect; - private final String sequenceNextValFragment; + private final QualifiedName physicalSequenceName; private final String[] keyColumns; - public Delegate(PostInsertIdentityPersister persister, Dialect dialect, String sequenceName) { + public Delegate(PostInsertIdentityPersister persister, QualifiedName physicalSequenceName) { super( persister ); - this.dialect = dialect; - this.sequenceNextValFragment = dialect.getSelectSequenceNextValString( sequenceName ); + this.physicalSequenceName = physicalSequenceName; this.keyColumns = getPersister().getRootTableKeyColumnNames(); if ( keyColumns.length > 1 ) { throw new HibernateException( "sequence-identity generator cannot be used with with multi-column keys" ); } } - public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert() { + @Override + public IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context) { + Dialect dialect = context.getDialect(); NoCommentsInsert insert = new NoCommentsInsert( dialect ); + String sequenceNextValFragment = dialect.getSelectSequenceNextValString( context.format( physicalSequenceName ) ); insert.addColumn( getPersister().getRootTableKeyColumnNames()[0], sequenceNextValFragment ); return insert; } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java index dcb907e14fde..edbf54eb08db 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java @@ -6,7 +6,10 @@ */ package org.hibernate.id.enhanced; +import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.ExportableProducer; +import org.hibernate.boot.model.relational.QualifiedName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; /** @@ -17,10 +20,14 @@ */ public interface DatabaseStructure extends ExportableProducer { /** - * The name of the database structure (table or sequence). + * The physical name of the database structure (table or sequence). + *

+ * Only available after {@link #registerExportables(Database)} + * has been called. + * * @return The structure name. */ - String getName(); + QualifiedName getPhysicalName(); /** * How many times has this structure been accessed through this reference? @@ -54,8 +61,45 @@ public interface DatabaseStructure extends ExportableProducer { * but before first use. * * @param optimizer The optimizer being applied to the generator. + * + * @deprecated Use {@link #configure(Optimizer)} instead. + */ + @Deprecated + default void prepare(Optimizer optimizer) { + } + + /** + * Configures this structure with the given arguments. + *

+ * Called just after instantiation, before {@link #initialize(SqlStringGenerationContext)} + * + * @param optimizer The optimizer being applied to the generator. + */ + default void configure(Optimizer optimizer) { + prepare( optimizer ); + } + + /** + * Register database objects involved in this structure, e.g. sequences, tables, etc. + *

+ * This method is called just once, after {@link #configure(Optimizer)}, + * but before {@link #initialize(SqlStringGenerationContext)}. + * + * @param database The database instance + */ + @Override + void registerExportables(Database database); + + /** + * Initializes this structure, in particular pre-generates SQL as necessary. + *

+ * This method is called just once, after {@link #registerExportables(Database)}, + * before first use. + * + * @param context A context to help generate SQL strings */ - void prepare(Optimizer optimizer); + default void initialize(SqlStringGenerationContext context) { + } /** * Is the structure physically a sequence? diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java index ed0e9be86c40..330f6a6577ec 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java @@ -15,6 +15,7 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.SharedSessionContractImplementor; import org.hibernate.id.IdentifierGeneratorHelper; @@ -42,7 +43,7 @@ public class SequenceStructure implements DatabaseStructure { private String sql; private boolean applyIncrementSizeToSourceValues; private int accessCounter; - protected String sequenceName; + protected QualifiedName physicalSequenceName; public SequenceStructure( JdbcEnvironment jdbcEnvironment, @@ -58,8 +59,8 @@ public SequenceStructure( } @Override - public String getName() { - return sequenceName; + public QualifiedName getPhysicalName() { + return physicalSequenceName; } @Override @@ -132,14 +133,18 @@ public String getTenantIdentifier() { } @Override - public void prepare(Optimizer optimizer) { + public void configure(Optimizer optimizer) { applyIncrementSizeToSourceValues = optimizer.applyIncrementSizeToSourceValues(); } @Override public void registerExportables(Database database) { buildSequence( database ); - this.sql = database.getJdbcEnvironment().getDialect().getSequenceNextValString( sequenceName ); + } + + @Override + public void initialize(SqlStringGenerationContext context) { + this.sql = context.getDialect().getSequenceNextValString( context.format( physicalSequenceName ) ); } @Override @@ -170,9 +175,6 @@ protected void buildSequence(Database database) { sequence = namespace.createSequence( logicalQualifiedSequenceName.getObjectName(), initialValue, sourceIncrementSize ); } - this.sequenceName = database.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - sequence.getName(), - database.getJdbcEnvironment().getDialect() - ); + this.physicalSequenceName = sequence.getName(); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java index 75fe27ae5ea4..5f15d73fad06 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStyleGenerator.java @@ -16,6 +16,7 @@ import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; @@ -297,7 +298,17 @@ public void configure(Type type, Properties params, ServiceRegistry serviceRegis incrementSize, ConfigurationHelper.getInt( INITIAL_PARAM, params, -1 ) ); - this.databaseStructure.prepare( optimizer ); + this.databaseStructure.configure( optimizer ); + } + + @Override + public void registerExportables(Database database) { + databaseStructure.registerExportables( database ); + } + + @Override + public void initialize(SqlStringGenerationContext context) { + this.databaseStructure.initialize( context ); } /** @@ -535,13 +546,8 @@ public boolean supportsBulkInsertionIdentifierGeneration() { } @Override - public String determineBulkInsertionIdentifierGenerationSelectFragment(Dialect dialect) { - return dialect.getSelectSequenceNextValString( getDatabaseStructure().getName() ); - } - - @Override - public void registerExportables(Database database) { - databaseStructure.registerExportables( database ); + public String determineBulkInsertionIdentifierGenerationSelectFragment(SqlStringGenerationContext context) { + return context.getDialect().getSelectSequenceNextValString( context.format( getDatabaseStructure().getPhysicalName() ) ); } /** diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index a80f334037da..509fc4cc5cd1 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -25,6 +25,7 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; @@ -231,7 +232,7 @@ public class TableGenerator implements PersistentIdentifierGenerator { private Type identifierType; private QualifiedName qualifiedTableName; - private String renderedTableName; + private QualifiedName physicalTableName; private String segmentColumnName; private String segmentValue; @@ -518,30 +519,31 @@ protected int determineIncrementSize(Properties params) { } @SuppressWarnings({"unchecked", "WeakerAccess"}) - protected String buildSelectQuery(Dialect dialect) { + protected String buildSelectQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) { final String alias = "tbl"; final String query = "select " + StringHelper.qualify( alias, valueColumnName ) + - " from " + renderedTableName + ' ' + alias + + " from " + formattedPhysicalTableName + ' ' + alias + " where " + StringHelper.qualify( alias, segmentColumnName ) + "=?"; final LockOptions lockOptions = new LockOptions( LockMode.PESSIMISTIC_WRITE ); lockOptions.setAliasSpecificLockMode( alias, LockMode.PESSIMISTIC_WRITE ); final Map updateTargetColumnsMap = Collections.singletonMap( alias, new String[] { valueColumnName } ); - return dialect.applyLocksToSql( query, lockOptions, updateTargetColumnsMap ); + return context.getDialect().applyLocksToSql( query, lockOptions, updateTargetColumnsMap ); } @SuppressWarnings("WeakerAccess") - protected String buildUpdateQuery() { - return "update " + renderedTableName + + protected String buildUpdateQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) { + return "update " + formattedPhysicalTableName + " set " + valueColumnName + "=? " + " where " + valueColumnName + "=? and " + segmentColumnName + "=?"; } @SuppressWarnings("WeakerAccess") - protected String buildInsertQuery() { - return "insert into " + renderedTableName + " (" + segmentColumnName + ", " + valueColumnName + ") " + " values (?,?)"; + protected String buildInsertQuery(String formattedPhysicalTableName, SqlStringGenerationContext context) { + return "insert into " + formattedPhysicalTableName + " (" + segmentColumnName + ", " + valueColumnName + ") " + " values (?,?)"; } - protected InitCommand generateInsertInitCommand() { + protected InitCommand generateInsertInitCommand(SqlStringGenerationContext context) { + String renderedTableName = context.format( physicalTableName ); int value = initialValue; if ( storeLastUsedValue ) { value = initialValue - 1; @@ -639,7 +641,7 @@ public IntegralDataTypeHolder execute(Connection connection) throws SQLException rows = executeUpdate( updatePS, statsCollector ); } catch (SQLException e) { - LOG.unableToUpdateQueryHiValue( renderedTableName, e ); + LOG.unableToUpdateQueryHiValue( physicalTableName.render(), e ); throw e; } } @@ -740,14 +742,15 @@ public void registerExportables(Database database) { } // allow physical naming strategies a chance to kick in - this.renderedTableName = database.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - dialect - ); - table.addInitCommand( generateInsertInitCommand() ); + this.physicalTableName = table.getQualifiedTableName(); + table.addInitCommand( this::generateInsertInitCommand ); + } - this.selectQuery = buildSelectQuery( dialect ); - this.updateQuery = buildUpdateQuery(); - this.insertQuery = buildInsertQuery(); + @Override + public void initialize(SqlStringGenerationContext context) { + String formattedPhysicalTableName = context.format( physicalTableName ); + this.selectQuery = buildSelectQuery( formattedPhysicalTableName, context ); + this.updateQuery = buildUpdateQuery( formattedPhysicalTableName, context ); + this.insertQuery = buildInsertQuery( formattedPhysicalTableName, context ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java index 38a82558adf7..17c44e9002b4 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java @@ -18,6 +18,7 @@ import org.hibernate.boot.model.relational.InitCommand; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.internal.FormatStyle; @@ -53,7 +54,7 @@ public class TableStructure implements DatabaseStructure { private final int incrementSize; private final Class numberType; - private String tableNameText; + private QualifiedName physicalTableName; private String valueColumnNameText; private String selectQuery; @@ -78,8 +79,8 @@ public TableStructure( } @Override - public String getName() { - return tableNameText; + public QualifiedName getPhysicalName() { + return physicalTableName; } @Override @@ -135,7 +136,7 @@ public IntegralDataTypeHolder execute(Connection connection) throws SQLException )) { final ResultSet selectRS = executeQuery( selectStatement, statsCollector ); if ( !selectRS.next() ) { - final String err = "could not read a hi value - you need to populate the table: " + tableNameText; + final String err = "could not read a hi value - you need to populate the table: " + physicalTableName; LOG.error( err ); throw new IdentifierGenerationException( err ); } @@ -161,7 +162,7 @@ public IntegralDataTypeHolder execute(Connection connection) throws SQLException rows = executeUpdate( updatePS, statsCollector ); } catch (SQLException e) { - LOG.unableToUpdateQueryHiValue( tableNameText, e ); + LOG.unableToUpdateQueryHiValue( physicalTableName.render(), e ); throw e; } } while ( rows == 0 ); @@ -239,22 +240,9 @@ public void registerExportables(Database database) { table = namespace.createTable( logicalQualifiedTableName.getObjectName(), false ); tableCreated = true; } + this.physicalTableName = table.getQualifiedTableName(); - this.tableNameText = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - dialect - ); - - this.valueColumnNameText = logicalValueColumnNameIdentifier.render( dialect ); - - - this.selectQuery = "select " + valueColumnNameText + " as id_val" + - " from " + dialect.appendLockHint( LockMode.PESSIMISTIC_WRITE, tableNameText ) + - dialect.getForUpdateString(); - - this.updateQuery = "update " + tableNameText + - " set " + valueColumnNameText + "= ?" + - " where " + valueColumnNameText + "=?"; + valueColumnNameText = logicalValueColumnNameIdentifier.render( dialect ); if ( tableCreated ) { ExportableColumn valueColumn = new ExportableColumn( database, @@ -265,9 +253,23 @@ public void registerExportables(Database database) { table.addColumn( valueColumn ); - table.addInitCommand( - new InitCommand( "insert into " + tableNameText + " values ( " + initialValue + " )" ) - ); + table.addInitCommand( context -> new InitCommand( "insert into " + + context.format( physicalTableName ) + " values ( " + initialValue + " )" ) ); } } + + @Override + public void initialize(SqlStringGenerationContext context) { + Dialect dialect = context.getDialect(); + + String formattedPhysicalTableName = context.format( physicalTableName ); + + this.selectQuery = "select " + valueColumnNameText + " as id_val" + + " from " + dialect.appendLockHint( LockMode.PESSIMISTIC_WRITE, formattedPhysicalTableName ) + + dialect.getForUpdateString(); + + this.updateQuery = "update " + formattedPhysicalTableName + + " set " + valueColumnNameText + "= ?" + + " where " + valueColumnNameText + "=?"; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/insert/InsertGeneratedIdentifierDelegate.java b/hibernate-core/src/main/java/org/hibernate/id/insert/InsertGeneratedIdentifierDelegate.java index 98da2c2b370b..564a7cad92f3 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/insert/InsertGeneratedIdentifierDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/id/insert/InsertGeneratedIdentifierDelegate.java @@ -8,6 +8,7 @@ import java.io.Serializable; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.SharedSessionContractImplementor; /** @@ -25,9 +26,10 @@ public interface InsertGeneratedIdentifierDelegate { * Build a {@link org.hibernate.sql.Insert} specific to the delegate's mode * of handling generated key values. * + * @param context A context to help generate SQL strings * @return The insert object. */ - IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(); + IdentifierGeneratingInsert prepareIdentifierGeneratingInsert(SqlStringGenerationContext context); /** * Perform the indicated insert SQL statement and determine the identifier value diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 87d51e7c514c..b404b1c7e022 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -18,7 +18,6 @@ import java.util.Map; import java.util.Set; import java.util.TimeZone; -import java.util.function.Function; import java.util.function.Supplier; import javax.naming.Reference; import javax.naming.StringRefAddr; @@ -49,6 +48,8 @@ import org.hibernate.TypeHelper; import org.hibernate.boot.cfgxml.spi.CfgXmlAccessService; import org.hibernate.boot.cfgxml.spi.LoadedConfig; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; @@ -171,6 +172,7 @@ public class SessionFactoryImpl implements SessionFactoryImplementor { private final transient SessionFactoryServiceRegistry serviceRegistry; private final transient EventEngine eventEngine; private final transient JdbcServices jdbcServices; + private final transient SqlStringGenerationContext sqlStringGenerationContext; private final transient SQLFunctionRegistry sqlFunctionRegistry; @@ -231,6 +233,7 @@ public SessionFactoryImpl( this.uuid = options.getUuid(); jdbcServices = serviceRegistry.getService( JdbcServices.class ); + sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcServices.getJdbcEnvironment() ); this.properties = new HashMap<>(); this.properties.putAll( serviceRegistry.getService( ConfigurationService.class ).getSettings() ); @@ -302,6 +305,7 @@ public void sessionFactoryClosed(SessionFactory factory) { settings.getDefaultSchemaName(), (RootClass) model ); + generator.initialize( sqlStringGenerationContext ); identifierGenerators.put( model.getEntityName(), generator ); } ); metadata.validate(); @@ -560,6 +564,11 @@ public JdbcServices getJdbcServices() { return jdbcServices; } + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return sqlStringGenerationContext; + } + public IdentifierGeneratorFactory getIdentifierGeneratorFactory() { return null; } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java index 105d59f50b84..70e8d878afb7 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Component.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Component.java @@ -16,6 +16,7 @@ import org.hibernate.EntityMode; import org.hibernate.MappingException; import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.registry.classloading.spi.ClassLoadingException; import org.hibernate.boot.spi.MetadataBuildingContext; @@ -513,6 +514,11 @@ public void execute(SharedSessionContractImplementor session, Object incomingObj public void registerExportables(Database database) { subGenerator.registerExportables( database ); } + + @Override + public void initialize(SqlStringGenerationContext context) { + subGenerator.initialize( context ); + } } } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java index afe61a784ffb..2c5ae2f33f42 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java @@ -16,6 +16,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; +import java.util.function.Function; import org.hibernate.HibernateException; import org.hibernate.MappingException; @@ -25,6 +26,7 @@ import org.hibernate.boot.model.relational.InitCommand; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter; @@ -67,7 +69,7 @@ public class Table implements RelationalModel, Serializable, Exportable { private boolean hasDenormalizedTables; private String comment; - private List initCommands; + private List> initCommandProducers; public Table() { } @@ -897,18 +899,30 @@ public String toString() { } } + /** + * @deprecated Use {@link #addInitCommand(Function)} instead. + */ + @Deprecated public void addInitCommand(InitCommand command) { - if ( initCommands == null ) { - initCommands = new ArrayList<>(); + addInitCommand( ignored -> command ); + } + + public void addInitCommand(Function commandProducer) { + if ( initCommandProducers == null ) { + initCommandProducers = new ArrayList<>(); } - initCommands.add( command ); + initCommandProducers.add( commandProducer ); } - public List getInitCommands() { - if ( initCommands == null ) { + public List getInitCommands(SqlStringGenerationContext context) { + if ( initCommandProducers == null ) { return Collections.emptyList(); } else { + List initCommands = new ArrayList<>(); + for ( Function producer : initCommandProducers ) { + initCommands.add( producer.apply( context ) ); + } return Collections.unmodifiableList( initCommands ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index 9c5ba874c7cd..2d95b4bdddb3 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -459,6 +459,7 @@ public AbstractCollectionPersister( factory.getSettings().getDefaultSchemaName(), null ); + identifierGenerator.initialize( creationContext.getSessionFactory().getSqlStringGenerationContext() ); } else { identifierType = null; diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index afe36eaf65bd..da6dcb72e859 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -37,6 +37,7 @@ import org.hibernate.Session; import org.hibernate.StaleObjectStateException; import org.hibernate.StaleStateException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.bytecode.enhance.spi.LazyPropertyInitializer; @@ -2957,8 +2958,8 @@ else if ( includeProperty[i] ) { * * @return The insert SQL statement string */ - public String generateIdentityInsertString(boolean[] includeProperty) { - Insert insert = identityDelegate.prepareIdentifierGeneratingInsert(); + public String generateIdentityInsertString(SqlStringGenerationContext context, boolean[] includeProperty) { + Insert insert = identityDelegate.prepareIdentifierGeneratingInsert( context ); insert.setTableName( getTableName( 0 ) ); // add normal properties except lobs @@ -4396,7 +4397,7 @@ private void doLateInit() { identityDelegate = ( (PostInsertIdentifierGenerator) getIdentifierGenerator() ) .getInsertGeneratedIdentifierDelegate( this, getFactory().getDialect(), useGetGeneratedKeys() ); sqlIdentityInsertString = customSQLInsert[0] == null - ? generateIdentityInsertString( getPropertyInsertability() ) + ? generateIdentityInsertString( factory.getSqlStringGenerationContext(), getPropertyInsertability() ) : substituteBrackets( customSQLInsert[0] ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java index 5ea8918308fa..eefebb38b9c7 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java @@ -22,6 +22,8 @@ import org.hibernate.boot.model.relational.Exportable; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; @@ -187,7 +189,8 @@ private void dropFromMetadata( Formatter formatter, GenerationTarget... targets) { final Database database = metadata.getDatabase(); - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); + SqlStringGenerationContext sqlStringGenerationContext = + new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ); boolean tryToDropCatalogs = false; boolean tryToDropSchemas = false; @@ -259,7 +262,7 @@ private void dropFromMetadata( } applySqlStrings( - auxiliaryDatabaseObject.sqlDropStrings( jdbcEnvironment.getDialect() ), + auxiliaryDatabaseObject.sqlDropStrings( sqlStringGenerationContext ), formatter, options, targets diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java index abd43db6eaf4..09a67f5af44a 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java @@ -8,6 +8,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.dialect.Dialect; import org.hibernate.tool.schema.spi.Exporter; @@ -23,11 +24,11 @@ public StandardAuxiliaryDatabaseObjectExporter(Dialect dialect) { @Override public String[] getSqlCreateStrings(AuxiliaryDatabaseObject object, Metadata metadata) { - return object.sqlCreateStrings( dialect ); + return object.sqlCreateStrings( new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ) ); } @Override public String[] getSqlDropStrings(AuxiliaryDatabaseObject object, Metadata metadata) { - return object.sqlDropStrings( dialect ); + return object.sqlDropStrings( new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ) ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java index 4b5534203ef4..54ebf07bf603 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java @@ -16,6 +16,8 @@ import org.hibernate.boot.model.relational.InitCommand; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Column; @@ -152,7 +154,9 @@ public String[] getSqlCreateStrings(Table table, Metadata metadata) { applyComments( table, tableName, sqlStrings ); - applyInitCommands( table, sqlStrings ); + SqlStringGenerationContext context = + new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ); + applyInitCommands( table, sqlStrings, context ); return sqlStrings.toArray( new String[ sqlStrings.size() ] ); } @@ -173,8 +177,8 @@ protected void applyComments(Table table, QualifiedName tableName, List } } - protected void applyInitCommands(Table table, List sqlStrings) { - for ( InitCommand initCommand : table.getInitCommands() ) { + protected void applyInitCommands(Table table, List sqlStrings, SqlStringGenerationContext context) { + for ( InitCommand initCommand : table.getInitCommands( context ) ) { Collections.addAll( sqlStrings, initCommand.getInitCommands() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java index 19e81d291371..f7a5a00a23ba 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java @@ -9,6 +9,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.Exportable; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; /** * Defines a contract for exporting of database objects (tables, sequences, etc) for use in SQL {@code CREATE} and diff --git a/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorNoIncrementTest.java b/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorNoIncrementTest.java index 433cef1cb090..fca2b880956a 100644 --- a/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorNoIncrementTest.java +++ b/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorNoIncrementTest.java @@ -76,6 +76,7 @@ public void setUp() throws Exception { generator.registerExportables( metadata.getDatabase() ); sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory(); + generator.initialize( sessionFactory.getSqlStringGenerationContext() ); sequenceValueExtractor = new SequenceValueExtractor( sessionFactory.getDialect(), TEST_SEQUENCE ); } diff --git a/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorTest.java b/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorTest.java index 6f8532764270..ce65ba2dea8a 100644 --- a/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/id/SequenceHiLoGeneratorTest.java @@ -71,6 +71,7 @@ public void setUp() throws Exception { generator.registerExportables( metadata.getDatabase() ); sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory(); + generator.initialize( sessionFactory.getSqlStringGenerationContext() ); sequenceValueExtractor = new SequenceValueExtractor( sessionFactory.getDialect(), TEST_SEQUENCE ); } diff --git a/hibernate-core/src/test/java/org/hibernate/id/SequenceStyleGeneratorBehavesLikeSequeceHiloGeneratorWitZeroIncrementSizeTest.java b/hibernate-core/src/test/java/org/hibernate/id/SequenceStyleGeneratorBehavesLikeSequeceHiloGeneratorWitZeroIncrementSizeTest.java index a818fa483a7e..f1c627e1af56 100644 --- a/hibernate-core/src/test/java/org/hibernate/id/SequenceStyleGeneratorBehavesLikeSequeceHiloGeneratorWitZeroIncrementSizeTest.java +++ b/hibernate-core/src/test/java/org/hibernate/id/SequenceStyleGeneratorBehavesLikeSequeceHiloGeneratorWitZeroIncrementSizeTest.java @@ -74,6 +74,7 @@ protected MetadataBuildingContext getBuildingContext() { generator.registerExportables( metadata.getDatabase() ); sessionFactory = (SessionFactoryImplementor) metadata.buildSessionFactory(); + generator.initialize( sessionFactory.getSqlStringGenerationContext() ); sequenceValueExtractor = new SequenceValueExtractor( sessionFactory.getDialect(), TEST_SEQUENCE ); } diff --git a/hibernate-core/src/test/java/org/hibernate/id/enhanced/SequenceStyleConfigUnitTest.java b/hibernate-core/src/test/java/org/hibernate/id/enhanced/SequenceStyleConfigUnitTest.java index c3eaf912a74f..4c00816b3eb2 100644 --- a/hibernate-core/src/test/java/org/hibernate/id/enhanced/SequenceStyleConfigUnitTest.java +++ b/hibernate-core/src/test/java/org/hibernate/id/enhanced/SequenceStyleConfigUnitTest.java @@ -11,6 +11,7 @@ import org.hibernate.MappingException; import org.hibernate.boot.internal.MetadataBuilderImpl; import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -45,13 +46,14 @@ public void testDefaultedSequenceBackedConfiguration() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( NoopOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } } @@ -76,13 +78,14 @@ public void testDefaultedTableBackedConfiguration() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( NoopOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } } @@ -103,13 +106,14 @@ public void testDefaultOptimizerBasedOnIncrementBackedBySequence() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } // for dialects which do support pooled sequences, we default to pooled+sequence @@ -121,13 +125,14 @@ public void testDefaultOptimizerBasedOnIncrementBackedBySequence() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } } @@ -146,13 +151,14 @@ public void testDefaultOptimizerBasedOnIncrementBackedByTable() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } } @@ -169,13 +175,14 @@ public void testForceTableUse() { SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( NoopOptimizer.class, generator.getOptimizer().getClass() ); - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, generator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + generator.getDatabaseStructure().getPhysicalName().render() ); } } @@ -193,9 +200,9 @@ public void testExplicitOptimizerWithExplicitIncrementSize() { props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" ); SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( NoopOptimizer.class, generator.getOptimizer().getClass() ); @@ -208,9 +215,8 @@ public void testExplicitOptimizerWithExplicitIncrementSize() { props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" ); generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( HiLoOptimizer.class, generator.getOptimizer().getClass() ); assertEquals( 20, generator.getOptimizer().getIncrementSize() ); @@ -222,9 +228,8 @@ public void testExplicitOptimizerWithExplicitIncrementSize() { props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" ); generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); // because the dialect reports to not support pooled seqyences, the expectation is that we will // use a table for the backing structure... assertClassAssignability( TableStructure.class, generator.getDatabaseStructure().getClass() ); @@ -243,27 +248,25 @@ public void testPreferredPooledOptimizerSetting() { props.setProperty( SequenceStyleGenerator.INCREMENT_PARAM, "20" ); SequenceStyleGenerator generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + Database database = new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledOptimizer.class, generator.getOptimizer().getClass() ); props.setProperty( Environment.PREFER_POOLED_VALUES_LO, "true" ); generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledLoOptimizer.class, generator.getOptimizer().getClass() ); props.setProperty( Environment.PREFERRED_POOLED_OPTIMIZER, StandardOptimizerDescriptor.POOLED_LOTL.getExternalName() ); generator = new SequenceStyleGenerator(); generator.configure( StandardBasicTypes.LONG, props, serviceRegistry ); - generator.registerExportables( - new Database( new MetadataBuilderImpl.MetadataBuildingOptionsImpl( serviceRegistry ) ) - ); + generator.registerExportables( database ); + generator.initialize( SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ) ); assertClassAssignability( SequenceStructure.class, generator.getDatabaseStructure().getClass() ); assertClassAssignability( PooledLoThreadLocalOptimizer.class, generator.getOptimizer().getClass() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/generationmappings/NewGeneratorMappingsTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/generationmappings/NewGeneratorMappingsTest.java index 9a778187a522..06c65b110819 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/generationmappings/NewGeneratorMappingsTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/generationmappings/NewGeneratorMappingsTest.java @@ -66,7 +66,8 @@ public void testMinimalSequenceEntity() { IdentifierGenerator generator = persister.getIdentifierGenerator(); assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; - assertEquals( MinimalSequenceEntity.SEQ_NAME, seqGenerator.getDatabaseStructure().getName() ); + assertEquals( MinimalSequenceEntity.SEQ_NAME, + seqGenerator.getDatabaseStructure().getPhysicalName().render() ); // 1 is the annotation default assertEquals( 1, seqGenerator.getDatabaseStructure().getInitialValue() ); // 50 is the annotation default @@ -91,7 +92,8 @@ public void testAutoEntity() { IdentifierGenerator generator = persister.getIdentifierGenerator(); assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; - assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, seqGenerator.getDatabaseStructure().getName() ); + assertEquals( SequenceStyleGenerator.DEF_SEQUENCE_NAME, + seqGenerator.getDatabaseStructure().getPhysicalName().render() ); assertEquals( SequenceStyleGenerator.DEFAULT_INITIAL_VALUE, seqGenerator.getDatabaseStructure().getInitialValue() ); assertEquals( SequenceStyleGenerator.DEFAULT_INCREMENT_SIZE, seqGenerator.getDatabaseStructure().getIncrementSize() ); } @@ -123,7 +125,7 @@ public void testSequencePerEntity() { SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; assertEquals( StringHelper.unqualifyEntityName( DedicatedSequenceEntity1.class.getName() ) + DedicatedSequenceEntity1.SEQUENCE_SUFFIX, - seqGenerator.getDatabaseStructure().getName() + seqGenerator.getDatabaseStructure().getPhysicalName().render() ); // Checking second entity. @@ -133,7 +135,7 @@ public void testSequencePerEntity() { seqGenerator = (SequenceStyleGenerator) generator; assertEquals( DedicatedSequenceEntity2.ENTITY_NAME + DedicatedSequenceEntity1.SEQUENCE_SUFFIX, - seqGenerator.getDatabaseStructure().getName() + seqGenerator.getDatabaseStructure().getPhysicalName().render() ); } } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java index 2117b99b5f46..d26a56c115a7 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java @@ -12,7 +12,6 @@ import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; -import org.hibernate.cfg.Environment; import org.hibernate.dialect.H2Dialect; import org.hibernate.id.IdentifierGenerator; import org.hibernate.id.enhanced.SequenceStyleGenerator; @@ -57,7 +56,7 @@ public void testHibernateSequenceSchema() { SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; Assert.assertEquals( Table.qualify( null, SCHEMA_NAME, SequenceStyleGenerator.DEF_SEQUENCE_NAME ), - seqGenerator.getDatabaseStructure().getName() + seqGenerator.getDatabaseStructure().getPhysicalName().render() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/auto/NewGeneratorsTests.java b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/auto/NewGeneratorsTests.java index 5d73e16074e3..88f1965e05cb 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/auto/NewGeneratorsTests.java +++ b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/auto/NewGeneratorsTests.java @@ -70,9 +70,9 @@ public void testAutoDefaults() { final DatabaseStructure databaseStructure = generator.getDatabaseStructure(); // HHH-14491 - what we want to happen - assertThat( databaseStructure.getName(), is( "Entity1_SEQ" ) ); + assertThat( databaseStructure.getPhysicalName().render(), is( "Entity1_SEQ" ) ); // or this depending on the discussion (Jira) about using entity name v. table name as the base - assertThat( databaseStructure.getName(), is( "tbl_1_SEQ" ) ); + assertThat( databaseStructure.getPhysicalName().render(), is( "tbl_1_SEQ" ) ); // HHH-14491 - this is what we want to have happen assertThat( databaseStructure.getIncrementSize(), is( 50 ) ); diff --git a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java index ec1e00f8a778..e91c214c8432 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/BasicSequenceTest.java @@ -64,7 +64,8 @@ public void testSequencePerEntity() { EntityPersister persister = sessionFactory().getEntityPersister( overriddenEntityName ); assertClassAssignability( SequenceStyleGenerator.class, persister.getIdentifierGenerator().getClass() ); SequenceStyleGenerator generator = (SequenceStyleGenerator) persister.getIdentifierGenerator(); - assertEquals( overriddenEntityName + SequenceStyleGenerator.DEF_SEQUENCE_SUFFIX, generator.getDatabaseStructure().getName() ); + assertEquals( overriddenEntityName + SequenceStyleGenerator.DEF_SEQUENCE_SUFFIX, + generator.getDatabaseStructure().getPhysicalName().getObjectName().getText() ); Session s = openSession(); s.beginTransaction(); diff --git a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceMismatchStrategyTest.java b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceMismatchStrategyTest.java index 759392532538..f9e43a4355b3 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceMismatchStrategyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/sequence/HiLoSequenceMismatchStrategyTest.java @@ -16,6 +16,7 @@ import org.hibernate.annotations.GenericGenerator; import org.hibernate.annotations.Parameter; +import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.cfg.AvailableSettings; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.Environment; @@ -93,8 +94,8 @@ public void testSequenceMismatchStrategyNotApplied() { SequenceStyleGenerator generator = (SequenceStyleGenerator) persister.getIdentifierGenerator(); assertClassAssignability( HiLoOptimizer.class, generator.getOptimizer().getClass() ); - String sequenceName = generator.getDatabaseStructure().getName(); - Assert.assertEquals( this.sequenceName, sequenceName ); + QualifiedName sequenceName = generator.getDatabaseStructure().getPhysicalName(); + Assert.assertEquals( this.sequenceName, sequenceName.render() ); int incrementSize = generator.getOptimizer().getIncrementSize(); Assert.assertNotEquals( 1, incrementSize ); diff --git a/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java b/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java index 3fd7d89eb86b..85a650740e6a 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java +++ b/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java @@ -17,6 +17,7 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -61,13 +62,13 @@ public void baseline() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, generator ); - - assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "my_real_db_sequence" ) ); + assertThat( sequenceStyleGenerator.getDatabaseStructure().getPhysicalName().render(), is( "my_real_db_sequence" ) ); // all the JPA defaults since they were not defined assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 100 ) ); @@ -91,6 +92,7 @@ public void testImplicitSequenceGenerator() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, @@ -99,7 +101,7 @@ public void testImplicitSequenceGenerator() { // PREFER_GENERATOR_NAME_AS_DEFAULT_SEQUENCE_NAME == false indicates that the legacy // default (hibernate_sequence) should be used - assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "hibernate_sequence" ) ); + assertThat( sequenceStyleGenerator.getDatabaseStructure().getPhysicalName().render(), is( "hibernate_sequence" ) ); // the JPA defaults since they were not defined assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 1 ) ); @@ -121,6 +123,7 @@ public void testImplicitSequenceGeneratorGeneratorName() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, @@ -129,7 +132,7 @@ public void testImplicitSequenceGeneratorGeneratorName() { // PREFER_GENERATOR_NAME_AS_DEFAULT_SEQUENCE_NAME == true (the default) indicates that the generator-name // should be used as the default instead. - assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "my_db_sequence" ) ); + assertThat( sequenceStyleGenerator.getDatabaseStructure().getPhysicalName().render(), is( "my_db_sequence" ) ); // the JPA defaults since they were not defined assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 1 ) ); @@ -153,10 +156,11 @@ public void testExplicitSequenceGeneratorImplicitName() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, generator ); // all the JPA defaults since they were not defined - assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( SequenceStyleGenerator.DEF_SEQUENCE_NAME ) ); + assertThat( sequenceStyleGenerator.getDatabaseStructure().getPhysicalName().render(), is( SequenceStyleGenerator.DEF_SEQUENCE_NAME ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 100 ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getIncrementSize(), is( 500 ) ); } @@ -177,13 +181,14 @@ public void testExplicitSequenceGeneratorImplicitNamePreferGeneratorName() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, generator ); // all the JPA defaults since they were not defined - assertThat( sequenceStyleGenerator.getDatabaseStructure().getName(), is( "my_db_sequence" ) ); + assertThat( sequenceStyleGenerator.getDatabaseStructure().getPhysicalName().render(), is( "my_db_sequence" ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 100 ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getIncrementSize(), is( 500 ) ); @@ -215,6 +220,7 @@ public void testImplicitTableGenerator() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final TableGenerator tableGenerator = assertTyping( TableGenerator.class, generator ); @@ -240,6 +246,7 @@ public void testExplicitTableGeneratorImplicitName() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final TableGenerator tableGenerator = assertTyping( TableGenerator.class, generator ); @@ -265,6 +272,7 @@ public void testExplicitTableGenerator() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); final TableGenerator tableGenerator = assertTyping( TableGenerator.class, generator ); @@ -292,6 +300,7 @@ public void testExplicitIncrementGenerator() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); assertTyping( IncrementGenerator.class, generator ); } @@ -311,6 +320,7 @@ public void testImplicitIncrementGenerator() { null, (RootClass) entityMapping ); + generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); assertTyping( IncrementGenerator.class, generator ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java index 67a7d427da28..1d4f1ee5e2d3 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java @@ -16,6 +16,8 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -34,7 +36,6 @@ import org.hibernate.testing.junit4.BaseUnitTestCase; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import static org.junit.Assert.assertEquals; @@ -77,7 +78,8 @@ public void testCreateTableOnUpdate() throws SQLException { // lets make sure the InitCommand is there assertEquals( 1, database.getDefaultNamespace().getTables().size() ); Table table = database.getDefaultNamespace().getTables().iterator().next(); - assertEquals( 1, table.getInitCommands().size() ); + SqlStringGenerationContext context = SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + assertEquals( 1, table.getInitCommands( context ).size() ); final TargetImpl target = new TargetImpl(); diff --git a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java index 82c3d26c91a5..fbb57577b2f3 100644 --- a/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java +++ b/hibernate-envers/src/main/java/org/hibernate/envers/enhanced/OrderedSequenceStructure.java @@ -9,6 +9,7 @@ import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.QualifiedName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; @@ -38,16 +39,13 @@ public OrderedSequenceStructure( @Override protected void buildSequence(Database database) { database.addAuxiliaryDatabaseObject( sequenceObject ); - this.sequenceName = database.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - getQualifiedName(), - database.getJdbcEnvironment().getDialect() - ); + this.physicalSequenceName = getQualifiedName(); } private class OrderedSequence implements AuxiliaryDatabaseObject { @Override public String getExportIdentifier() { - return getName(); + return getQualifiedName().render(); } @Override @@ -63,9 +61,10 @@ public boolean beforeTablesOnCreation() { } @Override - public String[] sqlCreateStrings(Dialect dialect) { + public String[] sqlCreateStrings(SqlStringGenerationContext context) { + Dialect dialect = context.getDialect(); final String[] createStrings = dialect.getCreateSequenceStrings( - getName(), + context.format( getPhysicalName() ), getInitialValue(), getSourceIncrementSize() ); @@ -80,8 +79,9 @@ public String[] sqlCreateStrings(Dialect dialect) { } @Override - public String[] sqlDropStrings(Dialect dialect) { - return dialect.getDropSequenceStrings( getName() ); + public String[] sqlDropStrings(SqlStringGenerationContext context) { + Dialect dialect = context.getDialect(); + return dialect.getDropSequenceStrings( context.format( getPhysicalName() ) ); } } } From 36b001221b8b61f20a5bb81b7e90fff931c4b528 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Mon, 8 Nov 2021 11:12:32 +0100 Subject: [PATCH 010/256] HHH-14921 Always use SqlStringGenerationContext for generation of SQL strings involving table/sequence names --- .../boot/model/relational/QualifiedName.java | 4 +- .../SqlStringGenerationContext.java | 20 ++++- .../SqlStringGenerationContextImpl.java | 22 ++++++ .../dialect/AbstractHANADialect.java | 12 ++- .../dialect/SQLServer2012Dialect.java | 16 ++-- .../hibernate/dialect/Teradata14Dialect.java | 14 ++-- .../dialect/unique/DB2UniqueDelegate.java | 18 ++--- .../dialect/unique/DefaultUniqueDelegate.java | 30 +++---- .../unique/InformixUniqueDelegate.java | 9 +-- .../dialect/unique/UniqueDelegate.java | 21 +++-- .../engine/jdbc/env/spi/JdbcEnvironment.java | 2 + .../AbstractMultiTableBulkIdStrategyImpl.java | 31 ++++---- .../hql/spi/id/MultiTableBulkIdStrategy.java | 7 +- .../AbstractCteValuesListBulkIdHandler.java | 5 +- .../id/cte/CteValuesListBulkIdStrategy.java | 4 +- .../GlobalTemporaryTableBulkIdStrategy.java | 13 ++- .../InlineIdsInClauseBulkIdStrategy.java | 4 +- .../InlineIdsOrClauseBulkIdStrategy.java | 4 +- ...neIdsSubSelectValueListBulkIdStrategy.java | 4 +- .../LocalTemporaryTableBulkIdStrategy.java | 13 ++- .../PersistentTableBulkIdStrategy.java | 15 ++-- .../internal/FilterConfiguration.java | 2 +- .../internal/SessionFactoryImpl.java | 3 +- .../org/hibernate/mapping/Constraint.java | 19 +++-- .../org/hibernate/mapping/ForeignKey.java | 14 +++- .../java/org/hibernate/mapping/Index.java | 56 +++++-------- .../org/hibernate/mapping/PrimaryKey.java | 5 +- .../hibernate/mapping/RelationalModel.java | 6 +- .../java/org/hibernate/mapping/Table.java | 79 +++++++------------ .../java/org/hibernate/mapping/UniqueKey.java | 9 +-- .../AbstractCollectionPersister.java | 10 +-- .../entity/AbstractEntityPersister.java | 8 +- .../entity/JoinedSubclassEntityPersister.java | 21 +++-- .../entity/SingleTableEntityPersister.java | 7 +- .../entity/UnionSubclassEntityPersister.java | 13 +-- .../internal/ExtractionContextImpl.java | 9 +++ ...tionExtractorJdbcDatabaseMetaDataImpl.java | 5 +- .../schema/extract/spi/ExtractionContext.java | 7 ++ .../internal/AbstractSchemaMigrator.java | 40 +++++++--- .../internal/GroupedSchemaMigratorImpl.java | 16 ++-- .../IndividuallySchemaMigratorImpl.java | 13 ++- .../schema/internal/SchemaCreatorImpl.java | 28 +++++-- .../schema/internal/SchemaDropperImpl.java | 19 +++-- ...andardAuxiliaryDatabaseObjectExporter.java | 12 +-- .../internal/StandardForeignKeyExporter.java | 22 ++---- .../internal/StandardIndexExporter.java | 21 ++--- .../internal/StandardSequenceExporter.java | 19 ++--- .../internal/StandardTableExporter.java | 24 ++---- .../internal/StandardUniqueKeyExporter.java | 13 ++- .../exec/ImprovedExtractionContextImpl.java | 9 +++ .../hibernate/tool/schema/spi/Exporter.java | 4 +- .../jpa/PersistenceUnitOverridesTests.java | 4 +- .../id/sequences/HibernateSequenceTest.java | 2 +- .../test/hbm/uk/UniqueDelegateTest.java | 21 +++-- .../enhanced/table/Db2GenerationTest.java | 21 ++++- .../tck2_2/GeneratedValueTests.java | 13 ++- .../CheckForExistingForeignKeyTest.java | 11 ++- .../internal/AbstractSchemaMigratorTest.java | 8 +- .../MonotonicRevisionNumberTest.java | 6 +- 59 files changed, 486 insertions(+), 381 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/QualifiedName.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/QualifiedName.java index 92139e89c224..b7af552a2b2d 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/QualifiedName.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/QualifiedName.java @@ -31,8 +31,8 @@ public interface QualifiedName { * Returns a String-form of the qualified name. *

* Depending on intention, may not be appropriate. May want - * {@link org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter#format} - * instead. See {@link org.hibernate.engine.jdbc.env.spi.JdbcEnvironment#getQualifiedObjectNameFormatter} + * {@link SqlStringGenerationContext#format} + * instead. * * @return The string form */ diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java index 9daa2271a94b..522fbb0bb480 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java @@ -7,6 +7,7 @@ package org.hibernate.boot.model.relational; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; /** * A context provided to methods responsible for generating SQL strings on startup. @@ -14,10 +15,18 @@ public interface SqlStringGenerationContext { /** - * @return The database dialect, to generate SQL fragments that are specific to each vendor. + * @return The database dialect of the current JDBC environment, + * to generate SQL fragments that are specific to each vendor. */ Dialect getDialect(); + /** + * @return The helper for dealing with identifiers in the current JDBC environment. + *

+ * Note that the Identifiers returned from this helper already account for auto-quoting. + */ + IdentifierHelper getIdentifierHelper(); + /** * Render a formatted a table name * @@ -45,4 +54,13 @@ public interface SqlStringGenerationContext { */ String format(QualifiedName qualifiedName); + /** + * Render a formatted sequence name, without the catalog (even the default one). + * + * @param qualifiedName The sequence name + * + * @return The formatted name + */ + String formatWithoutCatalog(QualifiedSequenceName qualifiedName); + } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java index 83b39a0efaee..6311ddc2779e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java @@ -11,6 +11,7 @@ import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter; @@ -22,10 +23,13 @@ public static SqlStringGenerationContext forTests(JdbcEnvironment jdbcEnvironmen } private final Dialect dialect; + private final IdentifierHelper identifierHelper; private final QualifiedObjectNameFormatter qualifiedObjectNameFormatter; + @SuppressWarnings("deprecation") public SqlStringGenerationContextImpl(JdbcEnvironment jdbcEnvironment) { this.dialect = jdbcEnvironment.getDialect(); + this.identifierHelper = jdbcEnvironment.getIdentifierHelper(); this.qualifiedObjectNameFormatter = jdbcEnvironment.getQualifiedObjectNameFormatter(); } @@ -34,6 +38,11 @@ public Dialect getDialect() { return dialect; } + @Override + public IdentifierHelper getIdentifierHelper() { + return identifierHelper; + } + @Override public String format(QualifiedTableName qualifiedName) { return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); @@ -49,4 +58,17 @@ public String format(QualifiedName qualifiedName) { return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); } + @Override + public String formatWithoutCatalog(QualifiedSequenceName qualifiedName) { + QualifiedSequenceName nameToFormat; + if ( qualifiedName.getCatalogName() != null + || qualifiedName.getSchemaName() == null && defaultSchema != null ) { + nameToFormat = new QualifiedSequenceName( null, + schemaWithDefault( qualifiedName.getSchemaName() ), qualifiedName.getSequenceName() ); + } + else { + nameToFormat = qualifiedName; + } + return qualifiedObjectNameFormatter.format( nameToFormat, dialect ); + } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java index 2c087e2ca3eb..61670a4fa4e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/AbstractHANADialect.java @@ -40,8 +40,10 @@ import org.hibernate.LockOptions; import org.hibernate.MappingException; import org.hibernate.ScrollMode; +import org.hibernate.boot.Metadata; import org.hibernate.boot.model.TypeContributions; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.function.AnsiTrimFunction; import org.hibernate.dialect.function.NoArgSQLFunction; @@ -728,14 +730,16 @@ public int getMaxLobPrefetchSize() { private final StandardTableExporter hanaTableExporter = new StandardTableExporter( this ) { @Override - public String[] getSqlCreateStrings(org.hibernate.mapping.Table table, org.hibernate.boot.Metadata metadata) { - String[] sqlCreateStrings = super.getSqlCreateStrings( table, metadata ); + public String[] getSqlCreateStrings(Table table, Metadata metadata, + SqlStringGenerationContext context) { + String[] sqlCreateStrings = super.getSqlCreateStrings( table, metadata, context ); return quoteTypeIfNecessary( table, sqlCreateStrings, getCreateTableString() ); } @Override - public String[] getSqlDropStrings(Table table, org.hibernate.boot.Metadata metadata) { - String[] sqlDropStrings = super.getSqlDropStrings( table, metadata ); + public String[] getSqlDropStrings(Table table, Metadata metadata, + SqlStringGenerationContext context) { + String[] sqlDropStrings = super.getSqlDropStrings( table, metadata, context ); return quoteTypeIfNecessary( table, sqlDropStrings, "drop table" ); } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServer2012Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServer2012Dialect.java index b25672486650..1818f5042ba9 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/SQLServer2012Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/SQLServer2012Dialect.java @@ -9,9 +9,9 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.pagination.LimitHandler; import org.hibernate.dialect.pagination.SQLServer2012LimitHandler; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.tool.schema.internal.StandardSequenceExporter; import org.hibernate.tool.schema.spi.Exporter; @@ -118,14 +118,12 @@ public SqlServerSequenceExporter(Dialect dialect) { } @Override - protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata) { - if ( name.getCatalogName() != null ) { - // SQL Server does not allow the catalog in the sequence name. - // See https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15&viewFallbackFrom=sql-server-ver12 - // Keeping the catalog in the name does not break on ORM, but it fails using Vert.X for Reactive. - name = new QualifiedSequenceName( null, name.getSchemaName(), name.getObjectName() ); - } - return super.getFormattedSequenceName( name, metadata ); + protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata, + SqlStringGenerationContext context) { + // SQL Server does not allow the catalog in the sequence name. + // See https://docs.microsoft.com/en-us/sql/t-sql/statements/create-sequence-transact-sql?view=sql-server-ver15&viewFallbackFrom=sql-server-ver12 + // Keeping the catalog in the name does not break on ORM, but it fails using Vert.X for Reactive. + return context.formatWithoutCatalog( name ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/Teradata14Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/Teradata14Dialect.java index 9744036649a6..1526bbb975e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/Teradata14Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/Teradata14Dialect.java @@ -17,6 +17,7 @@ import org.hibernate.LockOptions; import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.QualifiedNameImpl; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cfg.Environment; import org.hibernate.dialect.function.SQLFunctionTemplate; import org.hibernate.dialect.identity.IdentityColumnSupport; @@ -214,22 +215,19 @@ public TeradataIndexExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(Index index, Metadata metadata) { + public String[] getSqlCreateStrings(Index index, Metadata metadata, + SqlStringGenerationContext context) { final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - index.getTable().getQualifiedTableName(), - jdbcEnvironment.getDialect() - ); + final String tableName = context.format( index.getTable().getQualifiedTableName() ); final String indexNameForCreation; if ( getDialect().qualifyIndexName() ) { - indexNameForCreation = jdbcEnvironment.getQualifiedObjectNameFormatter().format( + indexNameForCreation = context.format( new QualifiedNameImpl( index.getTable().getQualifiedTableName().getCatalogName(), index.getTable().getQualifiedTableName().getSchemaName(), jdbcEnvironment.getIdentifierHelper().toIdentifier( index.getName() ) - ), - jdbcEnvironment.getDialect() + ) ); } else { diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/unique/DB2UniqueDelegate.java b/hibernate-core/src/main/java/org/hibernate/dialect/unique/DB2UniqueDelegate.java index b866eb762b95..1770053ab807 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/unique/DB2UniqueDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/unique/DB2UniqueDelegate.java @@ -9,6 +9,7 @@ import java.util.Iterator; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.mapping.UniqueKey; @@ -29,10 +30,11 @@ public DB2UniqueDelegate( Dialect dialect ) { } @Override - public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { + public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { if ( hasNullable( uniqueKey ) ) { return org.hibernate.mapping.Index.buildSqlCreateIndexString( - dialect, + context, uniqueKey.getName(), uniqueKey.getTable(), uniqueKey.columnIterator(), @@ -42,23 +44,21 @@ public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata m ); } else { - return super.getAlterTableToAddUniqueKeyCommand( uniqueKey, metadata ); + return super.getAlterTableToAddUniqueKeyCommand( uniqueKey, metadata, context ); } } @Override - public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { + public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { if ( hasNullable( uniqueKey ) ) { return org.hibernate.mapping.Index.buildSqlDropIndexString( uniqueKey.getName(), - metadata.getDatabase().getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - uniqueKey.getTable().getQualifiedTableName(), - metadata.getDatabase().getJdbcEnvironment().getDialect() - ) + context.format( uniqueKey.getTable().getQualifiedTableName() ) ); } else { - return super.getAlterTableToDropUniqueKeyCommand( uniqueKey, metadata ); + return super.getAlterTableToDropUniqueKeyCommand( uniqueKey, metadata, context ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/unique/DefaultUniqueDelegate.java b/hibernate-core/src/main/java/org/hibernate/dialect/unique/DefaultUniqueDelegate.java index eec4fbd62f1f..f73d3ca30db3 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/unique/DefaultUniqueDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/unique/DefaultUniqueDelegate.java @@ -9,8 +9,10 @@ import java.util.Iterator; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.mapping.Column; +import org.hibernate.mapping.Table; import org.hibernate.mapping.UniqueKey; /** @@ -34,23 +36,21 @@ public DefaultUniqueDelegate( Dialect dialect ) { // legacy model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override - public String getColumnDefinitionUniquenessFragment(org.hibernate.mapping.Column column) { + public String getColumnDefinitionUniquenessFragment(Column column, + SqlStringGenerationContext context) { return ""; } @Override - public String getTableCreationUniqueConstraintsFragment(org.hibernate.mapping.Table table) { + public String getTableCreationUniqueConstraintsFragment(Table table, + SqlStringGenerationContext context) { return ""; } @Override - public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - uniqueKey.getTable().getQualifiedTableName(), - dialect - ); + public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { + final String tableName = context.format( uniqueKey.getTable().getQualifiedTableName() ); final String constraintName = dialect.quote( uniqueKey.getName() ); return dialect.getAlterTableString( tableName ) @@ -76,13 +76,9 @@ protected String uniqueConstraintSql(UniqueKey uniqueKey) { } @Override - public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - uniqueKey.getTable().getQualifiedTableName(), - dialect - ); + public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { + final String tableName = context.format( uniqueKey.getTable().getQualifiedTableName() ); final StringBuilder buf = new StringBuilder( dialect.getAlterTableString(tableName) ); buf.append( getDropUnique() ); diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/unique/InformixUniqueDelegate.java b/hibernate-core/src/main/java/org/hibernate/dialect/unique/InformixUniqueDelegate.java index ae8fc4204cac..cffa7b5ffe82 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/unique/InformixUniqueDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/unique/InformixUniqueDelegate.java @@ -7,6 +7,7 @@ package org.hibernate.dialect.unique; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.mapping.UniqueKey; @@ -24,13 +25,11 @@ public InformixUniqueDelegate( Dialect dialect ) { // legacy model ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @Override - public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata) { + public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { // Do this here, rather than allowing UniqueKey/Constraint to do it. // We need full, simplified control over whether or not it happens. - final String tableName = metadata.getDatabase().getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - uniqueKey.getTable().getQualifiedTableName(), - metadata.getDatabase().getJdbcEnvironment().getDialect() - ); + final String tableName = context.format( uniqueKey.getTable().getQualifiedTableName() ); final String constraintName = dialect.quote( uniqueKey.getName() ); return dialect.getAlterTableString( tableName ) + " add constraint " + uniqueConstraintSql( uniqueKey ) + " constraint " + constraintName; diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/unique/UniqueDelegate.java b/hibernate-core/src/main/java/org/hibernate/dialect/unique/UniqueDelegate.java index 89ef372eba2c..6fdc173af796 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/unique/UniqueDelegate.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/unique/UniqueDelegate.java @@ -7,6 +7,9 @@ package org.hibernate.dialect.unique; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.mapping.Column; +import org.hibernate.mapping.Table; import org.hibernate.mapping.UniqueKey; /** @@ -38,11 +41,11 @@ public interface UniqueDelegate { * This is intended for dialects which do not support unique constraints * * @param column The column to which to apply the unique - * + * @param context A context for SQL string generation * @return The fragment (usually "unique"), empty string indicates the uniqueness will be indicated using a * different approach */ - public String getColumnDefinitionUniquenessFragment(org.hibernate.mapping.Column column); + public String getColumnDefinitionUniquenessFragment(Column column, SqlStringGenerationContext context); /** * Get the fragment that can be used to apply unique constraints as part of table creation. The implementation @@ -53,30 +56,32 @@ public interface UniqueDelegate { * Intended for Dialects which support unique constraint definitions, but just not in separate ALTER statements. * * @param table The table for which to generate the unique constraints fragment - * + * @param context A context for SQL string generation * @return The fragment, typically in the form {@code ", unique(col1, col2), unique( col20)"}. NOTE: The leading * comma is important! */ - public String getTableCreationUniqueConstraintsFragment(org.hibernate.mapping.Table table); + public String getTableCreationUniqueConstraintsFragment(Table table, SqlStringGenerationContext context); /** * Get the SQL ALTER TABLE command to be used to create the given UniqueKey. * * @param uniqueKey The UniqueKey instance. Contains all information about the columns * @param metadata Access to the bootstrap mapping information - * + * @param context A context for SQL string generation * @return The ALTER TABLE command */ - public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata); + public String getAlterTableToAddUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context); /** * Get the SQL ALTER TABLE command to be used to drop the given UniqueKey. * * @param uniqueKey The UniqueKey instance. Contains all information about the columns * @param metadata Access to the bootstrap mapping information - * + * @param context A context for SQL string generation * @return The ALTER TABLE command */ - public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata); + public String getAlterTableToDropUniqueKeyCommand(UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context); } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/JdbcEnvironment.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/JdbcEnvironment.java index 2a9fa57f0b6a..a0b48b68d699 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/JdbcEnvironment.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/spi/JdbcEnvironment.java @@ -55,7 +55,9 @@ public interface JdbcEnvironment extends Service { * Obtain support for formatting qualified object names. * * @return Qualified name support. + * @deprecated Use a provided {@link org.hibernate.boot.model.relational.SqlStringGenerationContext} instead. */ + @Deprecated QualifiedObjectNameFormatter getQualifiedObjectNameFormatter(); /** diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java index 71f4e763953b..7be9641f62ab 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/AbstractMultiTableBulkIdStrategyImpl.java @@ -12,6 +12,7 @@ import org.hibernate.QueryException; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; @@ -48,7 +49,8 @@ public final void prepare( JdbcServices jdbcServices, JdbcConnectionAccess connectionAccess, MetadataImplementor metadata, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { // build/get Table representation of the bulk-id tables - subclasses need hooks // for each: // handle DDL @@ -66,9 +68,8 @@ public final void prepare( continue; } - final String idTableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - determineIdTableName( jdbcEnvironment, entityBinding ), - jdbcEnvironment.getDialect() + final String idTableName = sqlStringGenerationContext.format( + determineIdTableName( jdbcEnvironment, entityBinding ) ); final Table idTable = new Table(); idTable.setName( idTableName ); @@ -81,7 +82,9 @@ public final void prepare( } augmentIdTableDefinition( idTable ); - final TT idTableInfo = buildIdTableInfo( entityBinding, idTable, jdbcServices, metadata, context ); + final TT idTableInfo = buildIdTableInfo( entityBinding, idTable, jdbcServices, metadata, context, + sqlStringGenerationContext + ); idTableInfoMap.put( entityBinding.getEntityName(), idTableInfo ); } @@ -125,16 +128,17 @@ protected abstract TT buildIdTableInfo( Table idTable, JdbcServices jdbcServices, MetadataImplementor metadata, - CT context); + CT context, + SqlStringGenerationContext sqlStringGenerationContext); - protected String buildIdTableCreateStatement(Table idTable, JdbcServices jdbcServices, MetadataImplementor metadata) { - final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); - final Dialect dialect = jdbcEnvironment.getDialect(); + protected String buildIdTableCreateStatement(Table idTable, MetadataImplementor metadata, + SqlStringGenerationContext sqlStringGenerationContext) { + final Dialect dialect = sqlStringGenerationContext.getDialect(); StringBuilder buffer = new StringBuilder( getIdTableSupport().getCreateIdTableCommand() ) .append( ' ' ) - .append( jdbcEnvironment.getQualifiedObjectNameFormatter().format( idTable.getQualifiedTableName(), dialect ) ) + .append( sqlStringGenerationContext.format( idTable.getQualifiedTableName() ) ) .append( " (" ); Iterator itr = idTable.getColumnIterator(); @@ -169,12 +173,9 @@ protected String buildIdTableCreateStatement(Table idTable, JdbcServices jdbcSer return buffer.toString(); } - protected String buildIdTableDropStatement(Table idTable, JdbcServices jdbcServices) { - final JdbcEnvironment jdbcEnvironment = jdbcServices.getJdbcEnvironment(); - final Dialect dialect = jdbcEnvironment.getDialect(); - + protected String buildIdTableDropStatement(Table idTable, SqlStringGenerationContext sqlStringGenerationContext) { return getIdTableSupport().getDropIdTableCommand() + " " - + jdbcEnvironment.getQualifiedObjectNameFormatter().format( idTable.getQualifiedTableName(), dialect ); + + sqlStringGenerationContext.format( idTable.getQualifiedTableName() ); } protected void finishPreparation( diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java index 76854f0ecd78..48553f3b128a 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java @@ -6,6 +6,7 @@ */ package org.hibernate.hql.spi.id; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; @@ -27,16 +28,18 @@ public interface MultiTableBulkIdStrategy { *

  • Adding tables to the passed Mappings, to be picked by by "schema management tools"
  • *
  • Manually creating the tables immediately through the passed JDBC Connection access
  • * - * @param jdbcServices The JdbcService object + * @param jdbcServices The JdbcService object * @param connectionAccess Access to the JDBC Connection * @param metadata Access to the O/RM mapping information * @param sessionFactoryOptions + * @param sqlStringGenerationContext */ void prepare( JdbcServices jdbcServices, JdbcConnectionAccess connectionAccess, MetadataImplementor metadata, - SessionFactoryOptions sessionFactoryOptions); + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext); /** * Release the strategy. Called as the SessionFactory is being shut down. diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/AbstractCteValuesListBulkIdHandler.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/AbstractCteValuesListBulkIdHandler.java index 2f4b75e7fee0..c8c118cf15a6 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/AbstractCteValuesListBulkIdHandler.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/AbstractCteValuesListBulkIdHandler.java @@ -72,13 +72,12 @@ protected String determineIdTableName(Queryable persister) { "HT_" + StringHelper.unquote( persister.getTableName(), jdbcEnvironment.getDialect() ) ).render(); - return jdbcEnvironment.getQualifiedObjectNameFormatter().format( + return persister.getFactory().getSqlStringGenerationContext().format( new QualifiedTableName( Identifier.toIdentifier( catalog ), Identifier.toIdentifier( schema ), Identifier.toIdentifier( qualifiedTableName ) - ), - jdbcEnvironment.getDialect() + ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/CteValuesListBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/CteValuesListBulkIdStrategy.java index 7a83da863b45..15848ee673b1 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/CteValuesListBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/cte/CteValuesListBulkIdStrategy.java @@ -6,6 +6,7 @@ */ package org.hibernate.hql.spi.id.cte; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; @@ -55,7 +56,8 @@ public void prepare( JdbcServices jdbcServices, JdbcConnectionAccess jdbcConnectionAccess, MetadataImplementor metadataImplementor, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { // nothing to do } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java index c1cbed9c660b..17dbd9de3107 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/global/GlobalTemporaryTableBulkIdStrategy.java @@ -8,6 +8,7 @@ import java.sql.PreparedStatement; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.boot.spi.MetadataImplementor; @@ -104,16 +105,14 @@ protected IdTableInfoImpl buildIdTableInfo( Table idTable, JdbcServices jdbcServices, MetadataImplementor metadata, - PreparationContextImpl context) { - context.creationStatements.add( buildIdTableCreateStatement( idTable, jdbcServices, metadata ) ); + PreparationContextImpl context, + SqlStringGenerationContext sqlStringGenerationContext) { + context.creationStatements.add( buildIdTableCreateStatement( idTable, metadata, sqlStringGenerationContext ) ); if ( dropIdTables ) { - context.dropStatements.add( buildIdTableDropStatement( idTable, jdbcServices ) ); + context.dropStatements.add( buildIdTableDropStatement( idTable, sqlStringGenerationContext ) ); } - final String renderedName = jdbcServices.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - idTable.getQualifiedTableName(), - jdbcServices.getJdbcEnvironment().getDialect() - ); + final String renderedName = sqlStringGenerationContext.format( idTable.getQualifiedTableName() ); return new IdTableInfoImpl( renderedName ); } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsInClauseBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsInClauseBulkIdStrategy.java index 90b95a1e8947..be03521fb2a0 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsInClauseBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsInClauseBulkIdStrategy.java @@ -6,6 +6,7 @@ */ package org.hibernate.hql.spi.id.inline; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; @@ -43,7 +44,8 @@ public void prepare( JdbcServices jdbcServices, JdbcConnectionAccess jdbcConnectionAccess, MetadataImplementor metadataImplementor, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { // nothing to do } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsOrClauseBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsOrClauseBulkIdStrategy.java index 0ec0204f1fca..1c479e1d9d29 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsOrClauseBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsOrClauseBulkIdStrategy.java @@ -6,6 +6,7 @@ */ package org.hibernate.hql.spi.id.inline; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; @@ -45,7 +46,8 @@ public void prepare( JdbcServices jdbcServices, JdbcConnectionAccess jdbcConnectionAccess, MetadataImplementor metadataImplementor, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { // nothing to do } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsSubSelectValueListBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsSubSelectValueListBulkIdStrategy.java index 09c15d520f11..7e6578357fb9 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsSubSelectValueListBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/inline/InlineIdsSubSelectValueListBulkIdStrategy.java @@ -6,6 +6,7 @@ */ package org.hibernate.hql.spi.id.inline; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; @@ -48,7 +49,8 @@ public void prepare( JdbcServices jdbcServices, JdbcConnectionAccess jdbcConnectionAccess, MetadataImplementor metadataImplementor, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { // nothing to do } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/local/LocalTemporaryTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/local/LocalTemporaryTableBulkIdStrategy.java index 68c2088932ba..715cb7fc9361 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/local/LocalTemporaryTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/local/LocalTemporaryTableBulkIdStrategy.java @@ -7,6 +7,7 @@ package org.hibernate.hql.spi.id.local; import org.hibernate.boot.TempTableDdlTransactionHandling; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.boot.spi.MetadataImplementor; @@ -111,17 +112,15 @@ protected IdTableInfoImpl buildIdTableInfo( Table idTable, JdbcServices jdbcServices, MetadataImplementor metadata, - PreparationContextImpl context) { - String dropStatement = buildIdTableDropStatement( idTable, jdbcServices ); + PreparationContextImpl context, + SqlStringGenerationContext sqlStringGenerationContext) { + String dropStatement = buildIdTableDropStatement( idTable, sqlStringGenerationContext ); if ( dropIdTables ) { context.dropStatements.add( dropStatement ); } return new IdTableInfoImpl( - jdbcServices.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - idTable.getQualifiedTableName(), - jdbcServices.getJdbcEnvironment().getDialect() - ), - buildIdTableCreateStatement( idTable, jdbcServices, metadata ), + sqlStringGenerationContext.format( idTable.getQualifiedTableName() ), + buildIdTableCreateStatement( idTable, metadata, sqlStringGenerationContext ), dropStatement ); } diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java index 04c2cf0c04e0..dec96832e55d 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/persistent/PersistentTableBulkIdStrategy.java @@ -10,6 +10,7 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.spi.MetadataBuildingOptions; import org.hibernate.boot.spi.MetadataImplementor; @@ -124,15 +125,15 @@ protected IdTableInfoImpl buildIdTableInfo( Table idTable, JdbcServices jdbcServices, MetadataImplementor metadata, - PreparationContextImpl context) { - final String renderedName = jdbcServices.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( - idTable.getQualifiedTableName(), - jdbcServices.getJdbcEnvironment().getDialect() - ); + PreparationContextImpl context, + SqlStringGenerationContext sqlStringGenerationContext) { + final String renderedName = sqlStringGenerationContext.format( idTable.getQualifiedTableName() ); - context.creationStatements.add( buildIdTableCreateStatement( idTable, jdbcServices, metadata ) ); + context.creationStatements.add( buildIdTableCreateStatement( idTable, metadata, + sqlStringGenerationContext + ) ); if ( dropIdTables ) { - context.dropStatements.add( buildIdTableDropStatement( idTable, jdbcServices ) ); + context.dropStatements.add( buildIdTableDropStatement( idTable, sqlStringGenerationContext ) ); } return new IdTableInfoImpl( renderedName ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java b/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java index 84461d642af3..c494da3c2029 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java @@ -59,7 +59,7 @@ public Map getAliasTableMap(SessionFactoryImplementor factory) { } else if ( persistentClass != null ) { String table = persistentClass.getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index b404b1c7e022..099de0dcb53c 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -325,7 +325,8 @@ public void sessionFactoryClosed(SessionFactory factory) { jdbcServices, buildLocalConnectionAccess(), metadata, - sessionFactoryOptions + sessionFactoryOptions, + sqlStringGenerationContext ); SchemaManagementToolCoordinator.process( diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java b/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java index a15aa2a3a656..85ab53899aff 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java @@ -18,6 +18,7 @@ import org.hibernate.HibernateException; import org.hibernate.boot.model.relational.Exportable; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.Mapping; import org.hibernate.internal.util.StringHelper; @@ -179,9 +180,12 @@ public boolean isGenerated(Dialect dialect) { return true; } - public String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema) { + @Override + public String sqlDropString(SqlStringGenerationContext context, + String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); if ( isGenerated( dialect ) ) { - final String tableName = getTable().getQualifiedName( dialect, defaultCatalog, defaultSchema ); + final String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); return String.format( Locale.ROOT, "%s evictData constraint %s", @@ -194,14 +198,17 @@ public String sqlDropString(Dialect dialect, String defaultCatalog, String defau } } - public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema) { + @Override + public String sqlCreateString(Mapping p, SqlStringGenerationContext context, String defaultCatalog, + String defaultSchema) { + Dialect dialect = context.getDialect(); if ( isGenerated( dialect ) ) { // Certain dialects (ex: HANA) don't support FKs as expected, but other constraints can still be created. // If that's the case, hasAlterTable() will be true, but getAddForeignKeyConstraintString will return // empty string. Prevent blank "alter table" statements. - String constraintString = sqlConstraintString( dialect, getName(), defaultCatalog, defaultSchema ); + String constraintString = sqlConstraintString( context, getName(), defaultCatalog, defaultSchema ); if ( !StringHelper.isEmpty( constraintString ) ) { - final String tableName = getTable().getQualifiedName( dialect, defaultCatalog, defaultSchema ); + final String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); return dialect.getAlterTableString( tableName ) + " " + constraintString; } } @@ -213,7 +220,7 @@ public List getColumns() { } public abstract String sqlConstraintString( - Dialect d, + SqlStringGenerationContext context, String constraintName, String defaultCatalog, String defaultSchema); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java b/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java index 73d891f1a647..3f309d1d4f9e 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java @@ -11,6 +11,7 @@ import java.util.List; import org.hibernate.MappingException; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.internal.util.StringHelper; @@ -54,11 +55,13 @@ public void setName(String name) { } } + @Override public String sqlConstraintString( - Dialect dialect, + SqlStringGenerationContext context, String constraintName, String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); String[] columnNames = new String[getColumnSpan()]; String[] referencedColumnNames = new String[getColumnSpan()]; @@ -87,7 +90,7 @@ public String sqlConstraintString( constraintName, columnNames, referencedTable.getQualifiedName( - dialect, + context, defaultCatalog, defaultSchema ), @@ -172,8 +175,11 @@ public void setKeyDefinition(String keyDefinition) { this.keyDefinition = keyDefinition; } - public String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema) { - String tableName = getTable().getQualifiedName( dialect, defaultCatalog, defaultSchema ); + @Override + public String sqlDropString(SqlStringGenerationContext context, + String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); + String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); final StringBuilder buf = new StringBuilder( dialect.getAlterTableString( tableName ) ); buf.append( dialect.getDropForeignKeyString() ); if ( dialect.supportsIfExistsBeforeConstraintName() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Index.java b/hibernate-core/src/main/java/org/hibernate/mapping/Index.java index 4d7da83ec7cc..cbc96c2ea023 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Index.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Index.java @@ -16,8 +16,8 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Exportable; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.Mapping; import org.hibernate.internal.util.StringHelper; @@ -32,10 +32,13 @@ public class Index implements RelationalModel, Exportable, Serializable { private java.util.Map columnOrderMap = new HashMap( ); private Identifier name; - public String sqlCreateString(Dialect dialect, Mapping mapping, String defaultCatalog, String defaultSchema) + @Override + public String sqlCreateString(Mapping mapping, SqlStringGenerationContext context, String defaultCatalog, + String defaultSchema) throws HibernateException { + Dialect dialect = context.getDialect(); return buildSqlCreateIndexString( - dialect, + context, getQuotedName( dialect ), getTable(), getColumnIterator(), @@ -47,12 +50,12 @@ public String sqlCreateString(Dialect dialect, Mapping mapping, String defaultCa } public static String buildSqlDropIndexString( - Dialect dialect, + SqlStringGenerationContext context, Table table, String name, String defaultCatalog, String defaultSchema) { - return buildSqlDropIndexString( name, table.getQualifiedName( dialect, defaultCatalog, defaultSchema ) ); + return buildSqlDropIndexString( name, table.getQualifiedName( context, defaultCatalog, defaultSchema ) ); } public static String buildSqlDropIndexString( @@ -62,7 +65,7 @@ public static String buildSqlDropIndexString( } public static String buildSqlCreateIndexString( - Dialect dialect, + SqlStringGenerationContext context, String name, Table table, Iterator columns, @@ -71,9 +74,9 @@ public static String buildSqlCreateIndexString( String defaultCatalog, String defaultSchema) { return buildSqlCreateIndexString( - dialect, + context.getDialect(), name, - table.getQualifiedName( dialect, defaultCatalog, defaultSchema ), + table.getQualifiedName( context, defaultCatalog, defaultSchema ), columns, columnOrderMap, unique @@ -109,42 +112,17 @@ public static String buildSqlCreateIndexString( } public static String buildSqlCreateIndexString( - Dialect dialect, - String name, - Table table, - Iterator columns, - boolean unique, - String defaultCatalog, - String defaultSchema) { - return buildSqlCreateIndexString( - dialect, - name, - table, - columns, - Collections.EMPTY_MAP, - unique, - defaultCatalog, - defaultSchema - ); - } - - public static String buildSqlCreateIndexString( - Dialect dialect, + SqlStringGenerationContext context, String name, Table table, Iterator columns, java.util.Map columnOrderMap, boolean unique, Metadata metadata) { - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - dialect - ); + final String tableName = context.format( table.getQualifiedTableName() ); return buildSqlCreateIndexString( - dialect, + context.getDialect(), name, tableName, columns, @@ -168,10 +146,12 @@ public String sqlConstraintString(Dialect dialect) { } @Override - public String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema) { + public String sqlDropString(SqlStringGenerationContext context, + String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); return "drop index " + StringHelper.qualify( - table.getQualifiedName( dialect, defaultCatalog, defaultSchema ), + table.getQualifiedName( context, defaultCatalog, defaultSchema ), getQuotedName( dialect ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/PrimaryKey.java b/hibernate-core/src/main/java/org/hibernate/mapping/PrimaryKey.java index 3c5e9a03b127..162c37f19855 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/PrimaryKey.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/PrimaryKey.java @@ -7,6 +7,7 @@ package org.hibernate.mapping; import java.util.Iterator; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.internal.util.StringHelper; @@ -69,7 +70,9 @@ public String sqlConstraintString(Dialect dialect) { return buf.append(')').toString(); } - public String sqlConstraintString(Dialect dialect, String constraintName, String defaultCatalog, String defaultSchema) { + @Override + public String sqlConstraintString(SqlStringGenerationContext context, String constraintName, String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); StringBuilder buf = new StringBuilder( dialect.getAddPrimaryKeyConstraintString(constraintName) ).append('('); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/RelationalModel.java b/hibernate-core/src/main/java/org/hibernate/mapping/RelationalModel.java index 167a28bc1a72..3f011773febd 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/RelationalModel.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/RelationalModel.java @@ -6,7 +6,7 @@ */ package org.hibernate.mapping; import org.hibernate.HibernateException; -import org.hibernate.dialect.Dialect; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.spi.Mapping; /** @@ -17,6 +17,6 @@ */ @Deprecated public interface RelationalModel { - String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema) throws HibernateException; - String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema); + String sqlCreateString(Mapping p, SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) throws HibernateException; + String sqlDropString(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema); } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java index 2c5ae2f33f42..8f802ce637df 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java @@ -28,8 +28,7 @@ import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; -import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter; +import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.spi.Mapping; import org.hibernate.tool.hbm2ddl.ColumnMetadata; import org.hibernate.tool.hbm2ddl.TableMetadata; @@ -114,28 +113,23 @@ public Table(Namespace namespace, String subselect, boolean isAbstract) { this.isAbstract = isAbstract; } - /** - * @deprecated Should use {@link QualifiedObjectNameFormatter#format} on QualifiedObjectNameFormatter - * obtained from {@link org.hibernate.engine.jdbc.env.spi.JdbcEnvironment} - */ - @Deprecated - public String getQualifiedName(Dialect dialect, String defaultCatalog, String defaultSchema) { + public String getQualifiedName(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { if ( subselect != null ) { return "( " + subselect + " )"; } - String quotedName = getQuotedName( dialect ); - String usedSchema = schema == null ? - defaultSchema : - getQuotedSchema( dialect ); - String usedCatalog = catalog == null ? - defaultCatalog : - getQuotedCatalog( dialect ); - return qualify( usedCatalog, usedSchema, quotedName ); + IdentifierHelper identifierHelper = context.getIdentifierHelper(); + Identifier usedSchema = schema == null ? + identifierHelper.toIdentifier( defaultSchema ) : + schema; + Identifier usedCatalog = catalog == null ? + identifierHelper.toIdentifier( defaultCatalog ) : + catalog; + return context.format( new QualifiedTableName( usedCatalog, usedSchema, name ) ); } /** - * @deprecated Should use {@link QualifiedObjectNameFormatter#format} on QualifiedObjectNameFormatter - * obtained from {@link org.hibernate.engine.jdbc.env.spi.JdbcEnvironment} + * @deprecated Should build a {@link QualifiedTableName} + * then use {@link SqlStringGenerationContext#format(QualifiedTableName)}. */ @Deprecated public static String qualify(String catalog, String schema, String table) { @@ -448,17 +442,14 @@ public Iterator sqlAlterStrings( Metadata metadata, TableInformation tableInfo, Identifier defaultCatalog, - Identifier defaultSchema) throws HibernateException { - - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( + Identifier defaultSchema, + SqlStringGenerationContext sqlStringGenerationContext) throws HibernateException { + final String tableName = sqlStringGenerationContext.format( new QualifiedTableName( catalog != null ? catalog : defaultCatalog, schema != null ? schema : defaultSchema, name - ), - dialect + ) ); StringBuilder root = new StringBuilder( dialect.getAlterTableString( tableName ) ) @@ -497,7 +488,7 @@ public Iterator sqlAlterStrings( UniqueKey uk = getOrCreateUniqueKey( keyName ); uk.addColumn( column ); alter.append( dialect.getUniqueDelegate() - .getColumnDefinitionUniquenessFragment( column ) ); + .getColumnDefinitionUniquenessFragment( column, sqlStringGenerationContext ) ); } if ( column.hasCheckConstraint() && dialect.supportsColumnCheck() ) { @@ -529,10 +520,13 @@ public boolean hasPrimaryKey() { return getPrimaryKey() != null; } - public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, String defaultSchema) { + @Override + public String sqlCreateString(Mapping p, SqlStringGenerationContext context, String defaultCatalog, + String defaultSchema) { + Dialect dialect = context.getDialect(); StringBuilder buf = new StringBuilder( hasPrimaryKey() ? dialect.getCreateTableString() : dialect.getCreateMultisetTableString() ) .append( ' ' ) - .append( getQualifiedName( dialect, defaultCatalog, defaultSchema ) ) + .append( getQualifiedName( context, defaultCatalog, defaultSchema ) ) .append( " (" ); boolean identityColumn = idValue != null && idValue.isIdentityColumn( p.getIdentifierGeneratorFactory(), dialect ); @@ -581,7 +575,7 @@ public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, UniqueKey uk = getOrCreateUniqueKey( keyName ); uk.addColumn( col ); buf.append( dialect.getUniqueDelegate() - .getColumnDefinitionUniquenessFragment( col ) ); + .getColumnDefinitionUniquenessFragment( col, context ) ); } if ( col.hasCheckConstraint() && dialect.supportsColumnCheck() ) { @@ -605,7 +599,7 @@ public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, .append( getPrimaryKey().sqlConstraintString( dialect ) ); } - buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( this ) ); + buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( this, context ) ); if ( dialect.supportsTableCheck() ) { for ( String checkConstraint : checkConstraints ) { @@ -624,8 +618,10 @@ public String sqlCreateString(Dialect dialect, Mapping p, String defaultCatalog, return buf.append( dialect.getTableTypeString() ).toString(); } - public String sqlDropString(Dialect dialect, String defaultCatalog, String defaultSchema) { - return dialect.getDropTableString( getQualifiedName( dialect, defaultCatalog, defaultSchema ) ); + @Override + public String sqlDropString(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { + Dialect dialect = context.getDialect(); + return dialect.getDropTableString( getQualifiedName( context, defaultCatalog, defaultSchema ) ); } public PrimaryKey getPrimaryKey() { @@ -831,25 +827,6 @@ public Iterator getCheckConstraintsIterator() { return checkConstraints.iterator(); } - public Iterator sqlCommentStrings(Dialect dialect, String defaultCatalog, String defaultSchema) { - List comments = new ArrayList<>(); - if ( dialect.supportsCommentOn() ) { - String tableName = getQualifiedName( dialect, defaultCatalog, defaultSchema ); - if ( comment != null ) { - comments.add( "comment on table " + tableName + " is '" + comment + "'" ); - } - Iterator iter = getColumnIterator(); - while ( iter.hasNext() ) { - Column column = (Column) iter.next(); - String columnComment = column.getComment(); - if ( columnComment != null ) { - comments.add( "comment on column " + tableName + '.' + column.getQuotedName( dialect ) + " is '" + columnComment + "'" ); - } - } - } - return comments.iterator(); - } - @Override public String getExportIdentifier() { return Table.qualify( diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/UniqueKey.java b/hibernate-core/src/main/java/org/hibernate/mapping/UniqueKey.java index b3ff9fdf5d0c..9ad096c2b562 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/UniqueKey.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/UniqueKey.java @@ -9,6 +9,7 @@ import java.util.HashMap; import java.util.Map; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.spi.Mapping; import org.hibernate.internal.util.StringHelper; @@ -23,7 +24,7 @@ public class UniqueKey extends Constraint { @Override public String sqlConstraintString( - Dialect dialect, + SqlStringGenerationContext context, String constraintName, String defaultCatalog, String defaultSchema) { @@ -34,9 +35,8 @@ public String sqlConstraintString( @Override public String sqlCreateString( - Dialect dialect, Mapping p, - String defaultCatalog, + SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { return null; // return dialect.getUniqueDelegate().getAlterTableToAddUniqueKeyCommand( @@ -46,8 +46,7 @@ public String sqlCreateString( @Override public String sqlDropString( - Dialect dialect, - String defaultCatalog, + SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { return null; // return dialect.getUniqueDelegate().getAlterTableToDropUniqueKeyCommand( diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index 2d95b4bdddb3..79252658cf60 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -240,7 +240,6 @@ public AbstractCollectionPersister( PersisterCreationContext creationContext) throws MappingException, CacheException { final Database database = creationContext.getMetadata().getDatabase(); - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); this.factory = creationContext.getSessionFactory(); this.cacheAccessStrategy = cacheAccessStrategy; @@ -272,7 +271,7 @@ public AbstractCollectionPersister( isArray = collectionBinding.isArray(); subselectLoadable = collectionBinding.isSubselectLoadable(); - qualifiedTableName = determineTableName( table, jdbcEnvironment ); + qualifiedTableName = determineTableName( table ); int spacesSize = 1 + collectionBinding.getSynchronizedTables().size(); spaces = new String[spacesSize]; @@ -615,15 +614,12 @@ else if ( !elementType.isEntityType() ) { initCollectionPropertyMap(); } - protected String determineTableName(Table table, JdbcEnvironment jdbcEnvironment) { + protected String determineTableName(Table table) { if ( table.getSubselect() != null ) { return "( " + table.getSubselect() + " )"; } - return jdbcEnvironment.getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - jdbcEnvironment.getDialect() - ); + return factory.getSqlStringGenerationContext().format( table.getQualifiedTableName() ); } private class ColumnMapperImpl implements ColumnMapper { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index da6dcb72e859..4ac395e1c5b3 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -66,7 +66,6 @@ import org.hibernate.engine.internal.StatefulPersistenceContext; import org.hibernate.engine.internal.Versioning; import org.hibernate.engine.jdbc.batch.internal.BasicBatchKey; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcCoordinator; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.engine.spi.CachedNaturalIdValueSource; @@ -5803,15 +5802,12 @@ public int determineTableNumberForColumn(String columnName) { return 0; } - protected String determineTableName(Table table, JdbcEnvironment jdbcEnvironment) { + protected String determineTableName(Table table) { if ( table.getSubselect() != null ) { return "( " + table.getSubselect() + " )"; } - return jdbcEnvironment.getQualifiedObjectNameFormatter().format( - table.getQualifiedTableName(), - jdbcEnvironment.getDialect() - ); + return factory.getSqlStringGenerationContext().format( table.getQualifiedTableName() ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index fa7f5cb30d88..9a5712d55eba 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -136,7 +136,6 @@ public JoinedSubclassEntityPersister( final SessionFactoryImplementor factory = creationContext.getSessionFactory(); final Database database = creationContext.getMetadata().getDatabase(); - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); // DISCRIMINATOR @@ -215,7 +214,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { while ( tItr.hasNext() ) { final Table table = (Table) tItr.next(); final KeyValue key = (KeyValue) kItr.next(); - final String tableName = determineTableName( table, jdbcEnvironment ); + final String tableName = determineTableName( table ); tableNames.add( tableName ); String[] keyCols = new String[idColumnSpan]; String[] keyColReaders = new String[idColumnSpan]; @@ -248,7 +247,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { isInverseTable[tableIndex] = join.isInverse(); Table table = join.getTable(); - final String tableName = determineTableName( table, jdbcEnvironment ); + final String tableName = determineTableName( table ); tableNames.add( tableName ); KeyValue key = join.getKey(); @@ -294,7 +293,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { isLazies.add( Boolean.FALSE ); isInverses.add( Boolean.FALSE ); isNullables.add( Boolean.FALSE ); - final String tableName = determineTableName( tab, jdbcEnvironment ); + final String tableName = determineTableName( tab ); subclassTableNames.add( tableName ); String[] key = new String[idColumnSpan]; Iterator cItr = tab.getPrimaryKey().getColumnIterator(); @@ -316,7 +315,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { isNullables.add( join.isOptional() ); isLazies.add( join.isLazy() ); - String joinTableName = determineTableName( joinTable, jdbcEnvironment ); + String joinTableName = determineTableName( joinTable ); subclassTableNames.add( joinTableName ); String[] key = new String[idColumnSpan]; Iterator citer = joinTable.getPrimaryKey().getColumnIterator(); @@ -440,7 +439,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { while ( iter.hasNext() ) { Property prop = (Property) iter.next(); String tabname = prop.getValue().getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ); @@ -462,7 +461,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { Property prop = (Property) iter.next(); Table tab = prop.getValue().getTable(); String tabname = tab.getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ); @@ -498,7 +497,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { notNullColumnTableNumbers = new int[subclassSpan]; final int id = getTableId( persistentClass.getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ), @@ -552,7 +551,7 @@ else if ( sc.isDiscriminatorValueNotNull() ) { discriminatorValues[k] = discriminatorValue.toString(); int id = getTableId( sc.getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ), @@ -677,7 +676,7 @@ private void associateSubclassNamesToSubclassTableIndexes( SessionFactoryImplementor factory) { final String tableName = persistentClass.getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ); @@ -688,7 +687,7 @@ private void associateSubclassNamesToSubclassTableIndexes( while ( itr.hasNext() ) { final Join join = (Join) itr.next(); final String secondaryTableName = join.getTable().getQualifiedName( - factory.getDialect(), + factory.getSqlStringGenerationContext(), factory.getSettings().getDefaultCatalogName(), factory.getSettings().getDefaultSchemaName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java index 566d8d5a49c0..33a9db1d43a1 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/SingleTableEntityPersister.java @@ -128,7 +128,6 @@ public SingleTableEntityPersister( final SessionFactoryImplementor factory = creationContext.getSessionFactory(); final Database database = creationContext.getMetadata().getDatabase(); - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); // CLASS + TABLE @@ -138,7 +137,7 @@ public SingleTableEntityPersister( isNullableTable = new boolean[joinSpan]; keyColumnNames = new String[joinSpan][]; final Table table = persistentClass.getRootTable(); - qualifiedTableNames[0] = determineTableName( table, jdbcEnvironment ); + qualifiedTableNames[0] = determineTableName( table ); isInverseTable[0] = false; isNullableTable[0] = false; @@ -178,7 +177,7 @@ public SingleTableEntityPersister( int j = 1; while ( joinIter.hasNext() ) { Join join = (Join) joinIter.next(); - qualifiedTableNames[j] = determineTableName( join.getTable(), jdbcEnvironment ); + qualifiedTableNames[j] = determineTableName( join.getTable() ); isInverseTable[j] = join.isInverse(); isNullableTable[j] = join.isOptional(); cascadeDeleteEnabled[j] = join.getKey().isCascadeDeleteEnabled() && @@ -255,7 +254,7 @@ public SingleTableEntityPersister( isDeferreds.add( isDeferred ); hasDeferred |= isDeferred; - String joinTableName = determineTableName( join.getTable(), jdbcEnvironment ); + String joinTableName = determineTableName( join.getTable() ); subclassTables.add( joinTableName ); Iterator iter = join.getKey().getColumnIterator(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java index 820383b9c6fa..ac8331ff20d0 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java @@ -20,6 +20,7 @@ import org.hibernate.LockMode; import org.hibernate.MappingException; import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cache.spi.access.EntityDataAccess; import org.hibernate.cache.spi.access.NaturalIdDataAccess; import org.hibernate.cfg.Settings; @@ -85,11 +86,10 @@ public UnionSubclassEntityPersister( final SessionFactoryImplementor factory = creationContext.getSessionFactory(); final Database database = creationContext.getMetadata().getDatabase(); - final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); // TABLE - tableName = determineTableName( persistentClass.getTable(), jdbcEnvironment ); + tableName = determineTableName( persistentClass.getTable() ); //Custom SQL @@ -168,7 +168,7 @@ public UnionSubclassEntityPersister( HashSet subclassTables = new HashSet(); Iterator subclassTableIter = persistentClass.getSubclassTableClosureIterator(); while ( subclassTableIter.hasNext() ) { - subclassTables.add( determineTableName( subclassTableIter.next(), jdbcEnvironment ) ); + subclassTables.add( determineTableName( subclassTableIter.next() ) ); } subclassSpaces = ArrayHelper.toStringArray( subclassTables ); @@ -182,7 +182,7 @@ public UnionSubclassEntityPersister( while ( tableIter.hasNext() ) { Table tab = tableIter.next(); if ( !tab.isAbstractUnionTable() ) { - final String tableName = determineTableName( tab, jdbcEnvironment ); + final String tableName = determineTableName( tab ); tableNames.add( tableName ); String[] key = new String[idColumnSpan]; Iterator citer = tab.getPrimaryKey().getColumnIterator(); @@ -363,10 +363,11 @@ protected String generateSubquery(PersistentClass model, Mapping mapping) { Dialect dialect = getFactory().getDialect(); Settings settings = getFactory().getSettings(); + SqlStringGenerationContext sqlStringGenerationContext = getFactory().getSqlStringGenerationContext(); if ( !model.hasSubclasses() ) { return model.getTable().getQualifiedName( - dialect, + sqlStringGenerationContext, settings.getDefaultCatalogName(), settings.getDefaultSchemaName() ); @@ -414,7 +415,7 @@ protected String generateSubquery(PersistentClass model, Mapping mapping) { buf.append( " from " ) .append( table.getQualifiedName( - dialect, + sqlStringGenerationContext, settings.getDefaultCatalogName(), settings.getDefaultSchemaName() ) diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java index 9da18060d212..1af9e2c66f65 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java @@ -11,6 +11,8 @@ import java.sql.SQLException; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.service.ServiceRegistry; @@ -22,6 +24,7 @@ public class ExtractionContextImpl implements ExtractionContext { private final ServiceRegistry serviceRegistry; private final JdbcEnvironment jdbcEnvironment; + private final SqlStringGenerationContext sqlStringGenerationContext; private final JdbcConnectionAccess jdbcConnectionAccess; private final DatabaseObjectAccess registeredTableAccess; private final Identifier defaultCatalogName; @@ -39,6 +42,7 @@ public ExtractionContextImpl( Identifier defaultSchemaName) { this.serviceRegistry = serviceRegistry; this.jdbcEnvironment = jdbcEnvironment; + this.sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcEnvironment ); this.jdbcConnectionAccess = jdbcConnectionAccess; this.registeredTableAccess = registeredTableAccess; this.defaultCatalogName = defaultCatalogName; @@ -55,6 +59,11 @@ public JdbcEnvironment getJdbcEnvironment() { return jdbcEnvironment; } + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return sqlStringGenerationContext; + } + @Override public Connection getJdbcConnection() { if ( jdbcConnection == null ) { 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 25d9f9c03e88..0f934484ccf5 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 @@ -137,11 +137,10 @@ protected void addColumns(TableInformation tableInformation) { 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 enable - final String tableName = extractionContext.getJdbcEnvironment().getQualifiedObjectNameFormatter().format( + final String tableName = extractionContext.getSqlStringGenerationContext().format( // The name comes from the database, so the case is correct // But we quote here to avoid issues with reserved words - tableInformation.getName().quote(), - extractionContext.getJdbcEnvironment().getDialect() + tableInformation.getName().quote() ); try { diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/spi/ExtractionContext.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/spi/ExtractionContext.java index ab1c7c4d597d..ddd2d52e3ae7 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/spi/ExtractionContext.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/spi/ExtractionContext.java @@ -16,6 +16,7 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.service.ServiceRegistry; @@ -30,6 +31,7 @@ public interface ExtractionContext { ServiceRegistry getServiceRegistry(); JdbcEnvironment getJdbcEnvironment(); + SqlStringGenerationContext getSqlStringGenerationContext(); Connection getJdbcConnection(); DatabaseMetaData getJdbcDatabaseMetaData(); @@ -83,6 +85,11 @@ public JdbcEnvironment getJdbcEnvironment() { return null; } + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return null; + } + @Override public Connection getJdbcConnection() { return null; diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java index 6acbc9fe73e5..e91b829034fc 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java @@ -22,6 +22,8 @@ import org.hibernate.boot.model.relational.Exportable; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; @@ -150,7 +152,9 @@ protected abstract NameSpaceTablesInformation performTablesMigration( boolean tryToCreateCatalogs, boolean tryToCreateSchemas, Set exportedCatalogs, - Namespace namespace, GenerationTarget[] targets); + Namespace namespace, + SqlStringGenerationContext sqlStringGenerationContext, + GenerationTarget[] targets); private void performMigration( Metadata metadata, @@ -164,6 +168,8 @@ private void performMigration( final Set exportIdentifiers = new HashSet( 50 ); final Database database = metadata.getDatabase(); + SqlStringGenerationContext sqlStringGenerationContext = + new SqlStringGenerationContextImpl( database.getJdbcEnvironment() ); // Drop all AuxiliaryDatabaseObjects for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : database.getAuxiliaryDatabaseObjects() ) { @@ -171,7 +177,7 @@ private void performMigration( applySqlStrings( true, dialect.getAuxiliaryDatabaseObjectExporter() - .getSqlDropStrings( auxiliaryDatabaseObject, metadata ), + .getSqlDropStrings( auxiliaryDatabaseObject, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -184,7 +190,7 @@ private void performMigration( if ( !auxiliaryDatabaseObject.beforeTablesOnCreation() && auxiliaryDatabaseObject.appliesToDialect( dialect ) ) { applySqlStrings( true, - auxiliaryDatabaseObject.sqlCreateStrings( dialect ), + auxiliaryDatabaseObject.sqlCreateStrings( sqlStringGenerationContext ), formatter, options, targets @@ -216,7 +222,7 @@ private void performMigration( tryToCreateSchemas, exportedCatalogs, namespace, - targets + sqlStringGenerationContext, targets ); tablesInformation.put( namespace, nameSpaceTablesInformation ); if ( schemaFilter.includeNamespace( namespace ) ) { @@ -228,7 +234,8 @@ private void performMigration( false, dialect.getSequenceExporter().getSqlCreateStrings( sequence, - metadata + metadata, + sqlStringGenerationContext ), formatter, options, @@ -247,7 +254,8 @@ private void performMigration( if ( schemaFilter.includeTable( table ) ) { final TableInformation tableInformation = nameSpaceTablesInformation.getTableInformation( table ); if ( tableInformation == null || tableInformation.isPhysicalTable() ) { - applyForeignKeys( table, tableInformation, dialect, metadata, formatter, options, targets ); + applyForeignKeys( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); } } } @@ -259,7 +267,7 @@ private void performMigration( if ( auxiliaryDatabaseObject.beforeTablesOnCreation() && auxiliaryDatabaseObject.appliesToDialect( dialect )) { applySqlStrings( true, - auxiliaryDatabaseObject.sqlCreateStrings( dialect ), + auxiliaryDatabaseObject.sqlCreateStrings( sqlStringGenerationContext ), formatter, options, targets @@ -274,10 +282,11 @@ protected void createTable( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { applySqlStrings( false, - dialect.getTableExporter().getSqlCreateStrings( table, metadata ), + dialect.getTableExporter().getSqlCreateStrings( table, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -291,6 +300,7 @@ protected void migrateTable( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { final Database database = metadata.getDatabase(); @@ -302,7 +312,8 @@ protected void migrateTable( metadata, tableInformation, database.getDefaultNamespace().getPhysicalName().getCatalog(), - database.getDefaultNamespace().getPhysicalName().getSchema() + database.getDefaultNamespace().getPhysicalName().getSchema(), + sqlStringGenerationContext ), formatter, options, @@ -317,6 +328,7 @@ protected void applyIndexes( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { final Exporter exporter = dialect.getIndexExporter(); @@ -331,7 +343,7 @@ protected void applyIndexes( if ( existingIndex == null ) { applySqlStrings( false, - exporter.getSqlCreateStrings( index, metadata ), + exporter.getSqlCreateStrings( index, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -352,6 +364,7 @@ protected void applyUniqueKeys( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { if ( uniqueConstraintStrategy == null ) { uniqueConstraintStrategy = determineUniqueConstraintSchemaUpdateStrategy( metadata ); @@ -374,7 +387,7 @@ protected void applyUniqueKeys( if ( uniqueConstraintStrategy == UniqueConstraintSchemaUpdateStrategy.DROP_RECREATE_QUIETLY ) { applySqlStrings( true, - exporter.getSqlDropStrings( uniqueKey, metadata ), + exporter.getSqlDropStrings( uniqueKey, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -383,7 +396,7 @@ protected void applyUniqueKeys( applySqlStrings( true, - exporter.getSqlCreateStrings( uniqueKey, metadata ), + exporter.getSqlCreateStrings( uniqueKey, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -410,6 +423,7 @@ protected void applyForeignKeys( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { if ( dialect.hasAlterTable() ) { final Exporter exporter = dialect.getForeignKeyExporter(); @@ -433,7 +447,7 @@ protected void applyForeignKeys( // in old SchemaUpdate code, this was the trigger to "create" applySqlStrings( false, - exporter.getSqlCreateStrings( foreignKey, metadata ), + exporter.getSqlCreateStrings( foreignKey, metadata, sqlStringGenerationContext ), formatter, options, targets diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java index aada23b2aac0..47d631cb2c2d 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/GroupedSchemaMigratorImpl.java @@ -11,6 +11,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Namespace; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.internal.Formatter; import org.hibernate.mapping.Table; @@ -46,7 +47,9 @@ protected NameSpaceTablesInformation performTablesMigration( boolean tryToCreateCatalogs, boolean tryToCreateSchemas, Set exportedCatalogs, - Namespace namespace, GenerationTarget[] targets) { + Namespace namespace, + SqlStringGenerationContext sqlStringGenerationContext, + GenerationTarget[] targets) { final NameSpaceTablesInformation tablesInformation = new NameSpaceTablesInformation( metadata.getDatabase().getJdbcEnvironment().getIdentifierHelper() ); @@ -68,11 +71,12 @@ protected NameSpaceTablesInformation performTablesMigration( checkExportIdentifier( table, exportIdentifiers ); final TableInformation tableInformation = tables.getTableInformation( table ); if ( tableInformation == null ) { - createTable( table, dialect, metadata, formatter, options, targets ); + createTable( table, dialect, metadata, formatter, options, sqlStringGenerationContext, targets ); } else if ( tableInformation.isPhysicalTable() ) { tablesInformation.addTableInformation( tableInformation ); - migrateTable( table, tableInformation, dialect, metadata, formatter, options, targets ); + migrateTable( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); } } } @@ -81,8 +85,10 @@ else if ( tableInformation.isPhysicalTable() ) { if ( schemaFilter.includeTable( table ) && table.isPhysicalTable() ) { final TableInformation tableInformation = tablesInformation.getTableInformation( table ); if ( tableInformation == null || tableInformation.isPhysicalTable() ) { - applyIndexes( table, tableInformation, dialect, metadata, formatter, options, targets ); - applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, targets ); + applyIndexes( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); + applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java index 0f2ae8a6dd0e..de510ae1c60a 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/IndividuallySchemaMigratorImpl.java @@ -11,6 +11,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Namespace; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.internal.Formatter; import org.hibernate.mapping.Table; @@ -47,6 +48,7 @@ protected NameSpaceTablesInformation performTablesMigration( boolean tryToCreateSchemas, Set exportedCatalogs, Namespace namespace, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget[] targets) { final NameSpaceTablesInformation tablesInformation = new NameSpaceTablesInformation( metadata.getDatabase().getJdbcEnvironment().getIdentifierHelper() ); @@ -68,11 +70,12 @@ protected NameSpaceTablesInformation performTablesMigration( checkExportIdentifier( table, exportIdentifiers ); final TableInformation tableInformation = existingDatabase.getTableInformation( table.getQualifiedTableName() ); if ( tableInformation == null ) { - createTable( table, dialect, metadata, formatter, options, targets ); + createTable( table, dialect, metadata, formatter, options, sqlStringGenerationContext, targets ); } else if ( tableInformation.isPhysicalTable() ) { tablesInformation.addTableInformation( tableInformation ); - migrateTable( table, tableInformation, dialect, metadata, formatter, options, targets ); + migrateTable( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); } } } @@ -81,8 +84,10 @@ else if ( tableInformation.isPhysicalTable() ) { if ( schemaFilter.includeTable( table ) && table.isPhysicalTable() ) { final TableInformation tableInformation = tablesInformation.getTableInformation( table ); if ( tableInformation == null || tableInformation.isPhysicalTable() ) { - applyIndexes( table, tableInformation, dialect, metadata, formatter, options, targets ); - applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, targets ); + applyIndexes( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); + applyUniqueKeys( table, tableInformation, dialect, metadata, formatter, options, + sqlStringGenerationContext, targets ); } } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java index f2d8e530a60e..63dbca8351f1 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java @@ -23,6 +23,8 @@ import org.hibernate.boot.model.relational.InitCommand; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.cfg.AvailableSettings; @@ -216,6 +218,8 @@ public void createFromMetadata( } final Database database = metadata.getDatabase(); + SqlStringGenerationContext sqlStringGenerationContext = + new SqlStringGenerationContextImpl( database.getJdbcEnvironment() ); final Set exportIdentifiers = new HashSet( 50 ); @@ -265,7 +269,8 @@ public void createFromMetadata( applySqlStrings( dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings( auxiliaryDatabaseObject, - metadata + metadata, + sqlStringGenerationContext ), formatter, options, @@ -290,7 +295,8 @@ public void createFromMetadata( applySqlStrings( dialect.getSequenceExporter().getSqlCreateStrings( sequence, - metadata + metadata, + sqlStringGenerationContext ), // dialect.getCreateSequenceStrings( // jdbcEnvironment.getQualifiedObjectNameFormatter().format( sequence.getName(), dialect ), @@ -313,7 +319,7 @@ public void createFromMetadata( } checkExportIdentifier( table, exportIdentifiers ); applySqlStrings( - dialect.getTableExporter().getSqlCreateStrings( table, metadata ), + dialect.getTableExporter().getSqlCreateStrings( table, metadata, sqlStringGenerationContext ), formatter, options, targets @@ -334,7 +340,9 @@ public void createFromMetadata( final Index index = (Index) indexItr.next(); checkExportIdentifier( index, exportIdentifiers ); applySqlStrings( - dialect.getIndexExporter().getSqlCreateStrings( index, metadata ), + dialect.getIndexExporter().getSqlCreateStrings( index, metadata, + sqlStringGenerationContext + ), formatter, options, targets @@ -347,7 +355,9 @@ public void createFromMetadata( final UniqueKey uniqueKey = (UniqueKey) ukItr.next(); checkExportIdentifier( uniqueKey, exportIdentifiers ); applySqlStrings( - dialect.getUniqueKeyExporter().getSqlCreateStrings( uniqueKey, metadata ), + dialect.getUniqueKeyExporter().getSqlCreateStrings( uniqueKey, metadata, + sqlStringGenerationContext + ), formatter, options, targets @@ -373,7 +383,9 @@ public void createFromMetadata( while ( fkItr.hasNext() ) { final ForeignKey foreignKey = (ForeignKey) fkItr.next(); applySqlStrings( - dialect.getForeignKeyExporter().getSqlCreateStrings( foreignKey, metadata ), + dialect.getForeignKeyExporter().getSqlCreateStrings( foreignKey, metadata, + sqlStringGenerationContext + ), formatter, options, targets @@ -388,7 +400,9 @@ public void createFromMetadata( && !auxiliaryDatabaseObject.beforeTablesOnCreation() ) { checkExportIdentifier( auxiliaryDatabaseObject, exportIdentifiers ); applySqlStrings( - dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings( auxiliaryDatabaseObject, metadata ), + dialect.getAuxiliaryDatabaseObjectExporter().getSqlCreateStrings( auxiliaryDatabaseObject, metadata, + sqlStringGenerationContext + ), formatter, options, targets diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java index eefebb38b9c7..f39e582d2368 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java @@ -216,7 +216,9 @@ private void dropFromMetadata( } applySqlStrings( - dialect.getAuxiliaryDatabaseObjectExporter().getSqlDropStrings( auxiliaryDatabaseObject, metadata ), + dialect.getAuxiliaryDatabaseObjectExporter().getSqlDropStrings( auxiliaryDatabaseObject, metadata, + sqlStringGenerationContext + ), formatter, options, targets @@ -230,7 +232,7 @@ private void dropFromMetadata( } // we need to drop all constraints/indexes prior to dropping the tables - applyConstraintDropping( namespace, metadata, formatter, options, targets ); + applyConstraintDropping( namespace, metadata, formatter, options, sqlStringGenerationContext, targets ); // now it's safe to drop the tables for ( Table table : namespace.getTables() ) { @@ -241,7 +243,9 @@ private void dropFromMetadata( continue; } checkExportIdentifier( table, exportIdentifiers ); - applySqlStrings( dialect.getTableExporter().getSqlDropStrings( table, metadata ), formatter, options,targets ); + applySqlStrings( dialect.getTableExporter().getSqlDropStrings( table, metadata, + sqlStringGenerationContext + ), formatter, options,targets ); } for ( Sequence sequence : namespace.getSequences() ) { @@ -249,7 +253,9 @@ private void dropFromMetadata( continue; } checkExportIdentifier( sequence, exportIdentifiers ); - applySqlStrings( dialect.getSequenceExporter().getSqlDropStrings( sequence, metadata ), formatter, options, targets ); + applySqlStrings( dialect.getSequenceExporter().getSqlDropStrings( sequence, metadata, + sqlStringGenerationContext + ), formatter, options, targets ); } } @@ -313,6 +319,7 @@ private void applyConstraintDropping( Metadata metadata, Formatter formatter, ExecutionOptions options, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { final Dialect dialect = metadata.getDatabase().getJdbcEnvironment().getDialect(); @@ -332,7 +339,9 @@ private void applyConstraintDropping( while ( fks.hasNext() ) { final ForeignKey foreignKey = (ForeignKey) fks.next(); applySqlStrings( - dialect.getForeignKeyExporter().getSqlDropStrings( foreignKey, metadata ), + dialect.getForeignKeyExporter().getSqlDropStrings( foreignKey, metadata, + sqlStringGenerationContext + ), formatter, options, targets diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java index 09a67f5af44a..773807908b44 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardAuxiliaryDatabaseObjectExporter.java @@ -8,7 +8,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; -import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.tool.schema.spi.Exporter; @@ -23,12 +23,14 @@ public StandardAuxiliaryDatabaseObjectExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(AuxiliaryDatabaseObject object, Metadata metadata) { - return object.sqlCreateStrings( new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ) ); + public String[] getSqlCreateStrings(AuxiliaryDatabaseObject object, Metadata metadata, + SqlStringGenerationContext context) { + return object.sqlCreateStrings( context ); } @Override - public String[] getSqlDropStrings(AuxiliaryDatabaseObject object, Metadata metadata) { - return object.sqlDropStrings( new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ) ); + public String[] getSqlDropStrings(AuxiliaryDatabaseObject object, Metadata metadata, + SqlStringGenerationContext context) { + return object.sqlDropStrings( context ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardForeignKeyExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardForeignKeyExporter.java index b6a61e7dc41d..5668e9b56a80 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardForeignKeyExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardForeignKeyExporter.java @@ -11,6 +11,7 @@ import org.hibernate.AssertionFailure; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Column; @@ -31,7 +32,7 @@ public StandardForeignKeyExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(ForeignKey foreignKey, Metadata metadata) { + public String[] getSqlCreateStrings(ForeignKey foreignKey, Metadata metadata, SqlStringGenerationContext context) { if ( !dialect.hasAlterTable() ) { return NO_COMMANDS; } @@ -90,15 +91,8 @@ public String[] getSqlCreateStrings(ForeignKey foreignKey, Metadata metadata) { i++; } - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - final String sourceTableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - foreignKey.getTable().getQualifiedTableName(), - dialect - ); - final String targetTableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - foreignKey.getReferencedTable().getQualifiedTableName(), - dialect - ); + final String sourceTableName = context.format( foreignKey.getTable().getQualifiedTableName() ); + final String targetTableName = context.format( foreignKey.getReferencedTable().getQualifiedTableName() ); final StringBuilder buffer = new StringBuilder( dialect.getAlterTableString( sourceTableName ) ) .append( @@ -126,7 +120,7 @@ public String[] getSqlCreateStrings(ForeignKey foreignKey, Metadata metadata) { } @Override - public String[] getSqlDropStrings(ForeignKey foreignKey, Metadata metadata) { + public String[] getSqlDropStrings(ForeignKey foreignKey, Metadata metadata, SqlStringGenerationContext context) { if ( !dialect.hasAlterTable() ) { return NO_COMMANDS; } @@ -139,11 +133,7 @@ public String[] getSqlDropStrings(ForeignKey foreignKey, Metadata metadata) { return NO_COMMANDS; } - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - final String sourceTableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - foreignKey.getTable().getQualifiedTableName(), - dialect - ); + final String sourceTableName = context.format( foreignKey.getTable().getQualifiedTableName() ); return new String[] { getSqlDropStrings( sourceTableName, foreignKey, dialect ) }; diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardIndexExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardIndexExporter.java index 426e6e1163a3..66def26486a6 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardIndexExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardIndexExporter.java @@ -11,6 +11,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.QualifiedNameImpl; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.internal.util.StringHelper; @@ -29,22 +30,18 @@ public StandardIndexExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(Index index, Metadata metadata) { + public String[] getSqlCreateStrings(Index index, Metadata metadata, SqlStringGenerationContext context) { final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - index.getTable().getQualifiedTableName(), - dialect - ); + final String tableName = context.format( index.getTable().getQualifiedTableName() ); final String indexNameForCreation; if ( dialect.qualifyIndexName() ) { - indexNameForCreation = jdbcEnvironment.getQualifiedObjectNameFormatter().format( + indexNameForCreation = context.format( new QualifiedNameImpl( index.getTable().getQualifiedTableName().getCatalogName(), index.getTable().getQualifiedTableName().getSchemaName(), jdbcEnvironment.getIdentifierHelper().toIdentifier( index.getQuotedName( dialect ) ) - ), - jdbcEnvironment.getDialect() + ) ); } else { @@ -78,16 +75,12 @@ public String[] getSqlCreateStrings(Index index, Metadata metadata) { } @Override - public String[] getSqlDropStrings(Index index, Metadata metadata) { + public String[] getSqlDropStrings(Index index, Metadata metadata, SqlStringGenerationContext context) { if ( !dialect.dropConstraints() ) { return NO_COMMANDS; } - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - final String tableName = jdbcEnvironment.getQualifiedObjectNameFormatter().format( - index.getTable().getQualifiedTableName(), - dialect - ); + final String tableName = context.format( index.getTable().getQualifiedTableName() ); final String indexNameForCreation; if ( dialect.qualifyIndexName() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardSequenceExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardSequenceExporter.java index cb04d29b5514..97dbe6b3dfc1 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardSequenceExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardSequenceExporter.java @@ -9,8 +9,8 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.tool.schema.spi.Exporter; /** @@ -24,26 +24,23 @@ public StandardSequenceExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(Sequence sequence, Metadata metadata) { + public String[] getSqlCreateStrings(Sequence sequence, Metadata metadata, SqlStringGenerationContext context) { return dialect.getCreateSequenceStrings( - getFormattedSequenceName( sequence.getName(), metadata ), + getFormattedSequenceName( sequence.getName(), metadata, context ), sequence.getInitialValue(), sequence.getIncrementSize() ); } @Override - public String[] getSqlDropStrings(Sequence sequence, Metadata metadata) { + public String[] getSqlDropStrings(Sequence sequence, Metadata metadata, SqlStringGenerationContext context) { return dialect.getDropSequenceStrings( - getFormattedSequenceName( sequence.getName(), metadata ) + getFormattedSequenceName( sequence.getName(), metadata, context ) ); } - protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata) { - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - return jdbcEnvironment.getQualifiedObjectNameFormatter().format( - name, - jdbcEnvironment.getDialect() - ); + protected String getFormattedSequenceName(QualifiedSequenceName name, Metadata metadata, + SqlStringGenerationContext context) { + return context.format( name ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java index 54ebf07bf603..8d0edf29617e 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardTableExporter.java @@ -17,9 +17,7 @@ import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedNameParser; import org.hibernate.boot.model.relational.SqlStringGenerationContext; -import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Column; import org.hibernate.mapping.Constraint; import org.hibernate.mapping.Table; @@ -37,23 +35,18 @@ public StandardTableExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(Table table, Metadata metadata) { + public String[] getSqlCreateStrings(Table table, Metadata metadata, + SqlStringGenerationContext context) { final QualifiedName tableName = new QualifiedNameParser.NameParts( Identifier.toIdentifier( table.getCatalog(), table.isCatalogQuoted() ), Identifier.toIdentifier( table.getSchema(), table.isSchemaQuoted() ), table.getNameIdentifier() ); - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); StringBuilder buf = new StringBuilder( tableCreateString( table.hasPrimaryKey() ) ) .append( ' ' ) - .append( - jdbcEnvironment.getQualifiedObjectNameFormatter().format( - tableName, - jdbcEnvironment.getDialect() - ) - ) + .append( context.format( tableName ) ) .append( " (" ); @@ -117,7 +110,7 @@ public String[] getSqlCreateStrings(Table table, Metadata metadata) { uk.addColumn( col ); buf.append( dialect.getUniqueDelegate() - .getColumnDefinitionUniquenessFragment( col ) + .getColumnDefinitionUniquenessFragment( col, context ) ); } @@ -137,7 +130,7 @@ public String[] getSqlCreateStrings(Table table, Metadata metadata) { .append( table.getPrimaryKey().sqlConstraintString( dialect ) ); } - buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( table ) ); + buf.append( dialect.getUniqueDelegate().getTableCreationUniqueConstraintsFragment( table, context ) ); applyTableCheck( table, buf ); @@ -154,8 +147,6 @@ public String[] getSqlCreateStrings(Table table, Metadata metadata) { applyComments( table, tableName, sqlStrings ); - SqlStringGenerationContext context = - new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ); applyInitCommands( table, sqlStrings, context ); return sqlStrings.toArray( new String[ sqlStrings.size() ] ); @@ -204,7 +195,7 @@ protected String tableCreateString(boolean hasPrimaryKey) { } @Override - public String[] getSqlDropStrings(Table table, Metadata metadata) { + public String[] getSqlDropStrings(Table table, Metadata metadata, SqlStringGenerationContext context) { StringBuilder buf = new StringBuilder( "drop table " ); if ( dialect.supportsIfExistsBeforeTableName() ) { buf.append( "if exists " ); @@ -215,8 +206,7 @@ public String[] getSqlDropStrings(Table table, Metadata metadata) { Identifier.toIdentifier( table.getSchema(), table.isSchemaQuoted() ), table.getNameIdentifier() ); - final JdbcEnvironment jdbcEnvironment = metadata.getDatabase().getJdbcEnvironment(); - buf.append( jdbcEnvironment.getQualifiedObjectNameFormatter().format( tableName, jdbcEnvironment.getDialect() ) ) + buf.append( context.format( tableName ) ) .append( dialect.getCascadeConstraintsString() ); if ( dialect.supportsIfExistsAfterTableName() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardUniqueKeyExporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardUniqueKeyExporter.java index 260f9d9e8971..cee8e41180cd 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardUniqueKeyExporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/StandardUniqueKeyExporter.java @@ -7,6 +7,7 @@ package org.hibernate.tool.schema.internal; import org.hibernate.boot.Metadata; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.mapping.Constraint; import org.hibernate.mapping.UniqueKey; @@ -26,21 +27,25 @@ public StandardUniqueKeyExporter(Dialect dialect) { } @Override - public String[] getSqlCreateStrings(Constraint constraint, Metadata metadata) { + public String[] getSqlCreateStrings(Constraint constraint, Metadata metadata, + SqlStringGenerationContext context) { return new String[] { dialect.getUniqueDelegate().getAlterTableToAddUniqueKeyCommand( (UniqueKey) constraint, - metadata + metadata, + context ) }; } @Override - public String[] getSqlDropStrings(Constraint constraint, Metadata metadata) { + public String[] getSqlDropStrings(Constraint constraint, Metadata metadata, + SqlStringGenerationContext context) { return new String[] { dialect.getUniqueDelegate().getAlterTableToDropUniqueKeyCommand( (UniqueKey) constraint, - metadata + metadata, + context ) }; } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java index 926673d739f8..20a56f55e850 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java @@ -11,6 +11,8 @@ import java.sql.SQLException; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.resource.transaction.spi.DdlTransactionIsolator; import org.hibernate.service.ServiceRegistry; @@ -22,6 +24,7 @@ public class ImprovedExtractionContextImpl implements ExtractionContext { private final ServiceRegistry serviceRegistry; private final JdbcEnvironment jdbcEnvironment; + private final SqlStringGenerationContext sqlStringGenerationContext; private final DdlTransactionIsolator ddlTransactionIsolator; private final Identifier defaultCatalog; private final Identifier defaultSchema; @@ -39,6 +42,7 @@ public ImprovedExtractionContextImpl( DatabaseObjectAccess databaseObjectAccess) { this.serviceRegistry = serviceRegistry; this.jdbcEnvironment = jdbcEnvironment; + this.sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcEnvironment ); this.ddlTransactionIsolator = ddlTransactionIsolator; this.defaultCatalog = defaultCatalog; this.defaultSchema = defaultSchema; @@ -55,6 +59,11 @@ public JdbcEnvironment getJdbcEnvironment() { return jdbcEnvironment; } + @Override + public SqlStringGenerationContext getSqlStringGenerationContext() { + return sqlStringGenerationContext; + } + @Override public Connection getJdbcConnection() { return ddlTransactionIsolator.getIsolatedConnection(); diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java index f7a5a00a23ba..ccb555505e75 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/Exporter.java @@ -27,12 +27,12 @@ public interface Exporter { * * @return The commands needed for creation scripting. */ - String[] getSqlCreateStrings(T exportable, Metadata metadata); + String[] getSqlCreateStrings(T exportable, Metadata metadata, SqlStringGenerationContext context); /** * Get the commands needed for dropping. * * @return The commands needed for drop scripting. */ - String[] getSqlDropStrings(T exportable, Metadata metadata); + String[] getSqlDropStrings(T exportable, Metadata metadata, SqlStringGenerationContext context); } diff --git a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/jpa/PersistenceUnitOverridesTests.java b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/jpa/PersistenceUnitOverridesTests.java index 0deba30d7dd6..fa3da3d3caa8 100644 --- a/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/jpa/PersistenceUnitOverridesTests.java +++ b/hibernate-core/src/test/java/org/hibernate/orm/test/bootstrap/jpa/PersistenceUnitOverridesTests.java @@ -18,6 +18,7 @@ import javax.persistence.spi.PersistenceUnitInfo; import javax.sql.DataSource; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.boot.spi.SessionFactoryOptions; import org.hibernate.cache.spi.access.AccessType; @@ -519,7 +520,8 @@ public void prepare( JdbcServices jdbcServices, JdbcConnectionAccess connectionAccess, MetadataImplementor metadata, - SessionFactoryOptions sessionFactoryOptions) { + SessionFactoryOptions sessionFactoryOptions, + SqlStringGenerationContext sqlStringGenerationContext) { } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java index d26a56c115a7..b8fe8eca1196 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java @@ -55,7 +55,7 @@ public void testHibernateSequenceSchema() { Assert.assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; Assert.assertEquals( - Table.qualify( null, SCHEMA_NAME, SequenceStyleGenerator.DEF_SEQUENCE_NAME ), + SCHEMA_NAME + "." + SequenceStyleGenerator.DEF_SEQUENCE_NAME, seqGenerator.getDatabaseStructure().getPhysicalName().render() ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/hbm/uk/UniqueDelegateTest.java b/hibernate-core/src/test/java/org/hibernate/test/hbm/uk/UniqueDelegateTest.java index c2bd6ba76c41..488bf875adf3 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/hbm/uk/UniqueDelegateTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/hbm/uk/UniqueDelegateTest.java @@ -8,6 +8,7 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -103,29 +104,33 @@ public MyUniqueDelegate(Dialect dialect) { } @Override - public String getColumnDefinitionUniquenessFragment(Column column) { + public String getColumnDefinitionUniquenessFragment(Column column, + SqlStringGenerationContext context) { getColumnDefinitionUniquenessFragmentCallCount++; - return super.getColumnDefinitionUniquenessFragment( column ); + return super.getColumnDefinitionUniquenessFragment( column, context ); } @Override - public String getTableCreationUniqueConstraintsFragment(Table table) { + public String getTableCreationUniqueConstraintsFragment(Table table, + SqlStringGenerationContext context) { getTableCreationUniqueConstraintsFragmentCallCount++; - return super.getTableCreationUniqueConstraintsFragment( table ); + return super.getTableCreationUniqueConstraintsFragment( table, context ); } @Override public String getAlterTableToAddUniqueKeyCommand( - UniqueKey uniqueKey, Metadata metadata) { + UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { getAlterTableToAddUniqueKeyCommandCallCount++; - return super.getAlterTableToAddUniqueKeyCommand( uniqueKey, metadata ); + return super.getAlterTableToAddUniqueKeyCommand( uniqueKey, metadata, context ); } @Override public String getAlterTableToDropUniqueKeyCommand( - UniqueKey uniqueKey, Metadata metadata) { + UniqueKey uniqueKey, Metadata metadata, + SqlStringGenerationContext context) { getAlterTableToDropUniqueKeyCommandCallCount++; - return super.getAlterTableToDropUniqueKeyCommand( uniqueKey, metadata ); + return super.getAlterTableToDropUniqueKeyCommand( uniqueKey, metadata, context ); } } } diff --git a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/table/Db2GenerationTest.java b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/table/Db2GenerationTest.java index cafc49a11186..5a90b082a57b 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/table/Db2GenerationTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/idgen/enhanced/table/Db2GenerationTest.java @@ -10,6 +10,9 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.cfg.AvailableSettings; @@ -52,8 +55,13 @@ public void testNewGeneratorTableCreationOnDb2() { assertEquals( 1, metadata.getDatabase().getDefaultNamespace().getTables().size() ); - final Table table = metadata.getDatabase().getDefaultNamespace().getTables().iterator().next(); - final String[] createCommands = new DB2Dialect().getTableExporter().getSqlCreateStrings( table, metadata ); + Database database = metadata.getDatabase(); + final Table table = database.getDefaultNamespace().getTables().iterator().next(); + SqlStringGenerationContext sqlStringGenerationContext = + SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + final String[] createCommands = new DB2Dialect().getTableExporter().getSqlCreateStrings( table, metadata, + sqlStringGenerationContext + ); assertContains( "sequence_name varchar(255) not null", createCommands[0] ); } finally { @@ -88,8 +96,13 @@ public void testLegacyGeneratorTableCreationOnDb2() { assertEquals( 1, metadata.getDatabase().getDefaultNamespace().getTables().size() ); - final Table table = metadata.getDatabase().getDefaultNamespace().getTables().iterator().next(); - final String[] createCommands = new DB2Dialect().getTableExporter().getSqlCreateStrings( table, metadata ); + Database database = metadata.getDatabase(); + final Table table = database.getDefaultNamespace().getTables().iterator().next(); + SqlStringGenerationContext sqlStringGenerationContext = + SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + final String[] createCommands = new DB2Dialect().getTableExporter().getSqlCreateStrings( table, metadata, + sqlStringGenerationContext + ); assertContains( "sequence_name varchar(255) not null", createCommands[0] ); } finally { diff --git a/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java b/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java index 85a650740e6a..de1d7458124e 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java +++ b/hibernate-core/src/test/java/org/hibernate/test/jpa/compliance/tck2_2/GeneratedValueTests.java @@ -16,7 +16,9 @@ import org.hibernate.boot.Metadata; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.Database; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; @@ -181,7 +183,10 @@ public void testExplicitSequenceGeneratorImplicitNamePreferGeneratorName() { null, (RootClass) entityMapping ); - generator.initialize( SqlStringGenerationContextImpl.forTests( bootModel.getDatabase().getJdbcEnvironment() ) ); + Database database = bootModel.getDatabase(); + SqlStringGenerationContext sqlStringGenerationContext = + SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + generator.initialize( sqlStringGenerationContext ); final SequenceStyleGenerator sequenceStyleGenerator = assertTyping( SequenceStyleGenerator.class, @@ -192,13 +197,13 @@ public void testExplicitSequenceGeneratorImplicitNamePreferGeneratorName() { assertThat( sequenceStyleGenerator.getDatabaseStructure().getInitialValue(), is( 100 ) ); assertThat( sequenceStyleGenerator.getDatabaseStructure().getIncrementSize(), is( 500 ) ); - final Sequence sequence = bootModel.getDatabase() - .getDefaultNamespace() + final Sequence sequence = database.getDefaultNamespace() .locateSequence( Identifier.toIdentifier( "my_db_sequence" ) ); assertThat( sequence, notNullValue() ); final String[] sqlCreateStrings = new H2Dialect().getSequenceExporter().getSqlCreateStrings( sequence, - bootModel + bootModel, + sqlStringGenerationContext ); assertThat( sqlCreateStrings.length, is( 1 ) ); final String cmd = sqlCreateStrings[0].toLowerCase(); diff --git a/hibernate-core/src/test/java/org/hibernate/test/tool/schema/internal/CheckForExistingForeignKeyTest.java b/hibernate-core/src/test/java/org/hibernate/test/tool/schema/internal/CheckForExistingForeignKeyTest.java index a0608944ba62..6a7d1b2bbe6f 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/tool/schema/internal/CheckForExistingForeignKeyTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/tool/schema/internal/CheckForExistingForeignKeyTest.java @@ -12,6 +12,7 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Namespace.Name; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.internal.Formatter; @@ -53,10 +54,14 @@ public SchemaMigrator() { * Needed implementation. Not used in test. */ @Override - protected NameSpaceTablesInformation performTablesMigration(Metadata metadata, DatabaseInformation existingDatabase, ExecutionOptions options, + protected NameSpaceTablesInformation performTablesMigration(Metadata metadata, + DatabaseInformation existingDatabase, ExecutionOptions options, Dialect dialect, - Formatter formatter, Set exportIdentifiers, boolean tryToCreateCatalogs, boolean tryToCreateSchemas, - Set exportedCatalogs, Namespace namespace, GenerationTarget[] targets) { + Formatter formatter, Set exportIdentifiers, boolean tryToCreateCatalogs, + boolean tryToCreateSchemas, + Set exportedCatalogs, Namespace namespace, + SqlStringGenerationContext sqlStringGenerationContext, + GenerationTarget[] targets) { return null; } } diff --git a/hibernate-core/src/test/java/org/hibernate/tool/schema/internal/AbstractSchemaMigratorTest.java b/hibernate-core/src/test/java/org/hibernate/tool/schema/internal/AbstractSchemaMigratorTest.java index 8635fb788a83..40ff8255890a 100644 --- a/hibernate-core/src/test/java/org/hibernate/tool/schema/internal/AbstractSchemaMigratorTest.java +++ b/hibernate-core/src/test/java/org/hibernate/tool/schema/internal/AbstractSchemaMigratorTest.java @@ -14,6 +14,7 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.internal.Formatter; import org.hibernate.testing.TestForIssue; @@ -44,7 +45,12 @@ public class AbstractSchemaMigratorTest { public void testForeignKeyPreExistenceDetectionIgnoresCaseForTableAndColumnName() { final AbstractSchemaMigrator schemaMigrator = new AbstractSchemaMigrator(null, null) { @Override - protected NameSpaceTablesInformation performTablesMigration(Metadata metadata, DatabaseInformation existingDatabase, ExecutionOptions options, Dialect dialect, Formatter formatter, Set exportIdentifiers, boolean tryToCreateCatalogs, boolean tryToCreateSchemas, Set exportedCatalogs, Namespace namespace, GenerationTarget[] targets) { return null; } + protected NameSpaceTablesInformation performTablesMigration(Metadata metadata, + DatabaseInformation existingDatabase, ExecutionOptions options, Dialect dialect, + Formatter formatter, Set exportIdentifiers, boolean tryToCreateCatalogs, + boolean tryToCreateSchemas, Set exportedCatalogs, Namespace namespace, + SqlStringGenerationContext sqlStringGenerationContext, + GenerationTarget[] targets) { return null; } }; final TableInformation existingTableInformation = mock(TableInformation.class); diff --git a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java index e04e094183a5..0da7c9cee19b 100644 --- a/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java +++ b/hibernate-envers/src/test/java/org/hibernate/envers/test/integration/reventity/MonotonicRevisionNumberTest.java @@ -12,6 +12,8 @@ import org.hibernate.boot.model.relational.AuxiliaryDatabaseObject; import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.dialect.Oracle8iDialect; import org.hibernate.envers.enhanced.OrderedSequenceGenerator; import org.hibernate.envers.enhanced.SequenceIdRevisionEntity; @@ -43,11 +45,13 @@ public void testOracleSequenceOrder() { Assert.assertTrue( OrderedSequenceGenerator.class.isInstance( generator ) ); Database database = metadata().getDatabase(); + SqlStringGenerationContext sqlStringGenerationContext = + SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); Optional sequenceOptional = database.getAuxiliaryDatabaseObjects().stream() .filter( o -> "REVISION_GENERATOR".equals( o.getExportIdentifier() ) ) .findFirst(); assertThat( sequenceOptional ).isPresent(); - String[] sqlCreateStrings = sequenceOptional.get().sqlCreateStrings( database.getDialect() ); + String[] sqlCreateStrings = sequenceOptional.get().sqlCreateStrings( sqlStringGenerationContext ); Assert.assertTrue( "Oracle sequence needs to be ordered in RAC environment.", sqlCreateStrings[0].toLowerCase().endsWith( " order" ) From a9f1ada94d8f70966dadb5dab639e58176d4b853 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 10 Nov 2021 13:54:00 +0100 Subject: [PATCH 011/256] HHH-14921 Delay determination of the default catalog/schema until schema management tool or session factory creation --- .../InFlightMetadataCollectorImpl.java | 10 -- .../boot/internal/MetadataBuilderImpl.java | 17 +-- .../SessionFactoryOptionsBuilder.java | 22 +++- .../SqlStringGenerationContext.java | 17 +++ .../SqlStringGenerationContextImpl.java | 110 +++++++++++++++++- .../source/internal/hbm/ModelBinder.java | 20 ++-- ...stractDelegatingSessionFactoryOptions.java | 10 ++ .../boot/spi/SessionFactoryOptions.java | 20 ++++ .../main/java/org/hibernate/cfg/Settings.java | 4 +- .../cfg/annotations/TableBinder.java | 4 +- .../internal/FilterConfiguration.java | 4 +- .../internal/SessionFactoryImpl.java | 11 +- .../loader/custom/sql/SQLQueryParser.java | 20 ++-- .../org/hibernate/mapping/Constraint.java | 4 +- .../org/hibernate/mapping/ForeignKey.java | 6 +- .../java/org/hibernate/mapping/Index.java | 6 +- .../java/org/hibernate/mapping/KeyValue.java | 10 ++ .../org/hibernate/mapping/SimpleValue.java | 23 ++-- .../java/org/hibernate/mapping/Table.java | 26 +---- .../AbstractCollectionPersister.java | 2 - .../entity/JoinedSubclassEntityPersister.java | 25 +--- .../entity/UnionSubclassEntityPersister.java | 9 +- .../internal/DatabaseInformationImpl.java | 6 +- .../internal/ExtractionContextImpl.java | 16 +-- .../internal/AbstractSchemaMigrator.java | 16 ++- .../internal/AbstractSchemaValidator.java | 10 +- .../tool/schema/internal/Helper.java | 6 +- .../HibernateSchemaManagementTool.java | 7 +- .../schema/internal/SchemaCreatorImpl.java | 5 +- .../schema/internal/SchemaDropperImpl.java | 4 +- .../exec/ImprovedExtractionContextImpl.java | 14 +-- .../tool/schema/spi/ExtractionTool.java | 4 +- .../TestExtraPhysicalTableTypes.java | 14 ++- .../SchemaUpdateTableBackedSequenceTest.java | 2 +- 34 files changed, 307 insertions(+), 177 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java index 5b780c15eef0..4f0c817e8c15 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/InFlightMetadataCollectorImpl.java @@ -2197,8 +2197,6 @@ private void processExportableProducers() { // for now we only handle id generators as ExportableProducers final Dialect dialect = getDatabase().getJdbcEnvironment().getDialect(); - final String defaultCatalog = extractName( getDatabase().getDefaultNamespace().getName().getCatalog(), dialect ); - final String defaultSchema = extractName( getDatabase().getDefaultNamespace().getName().getSchema(), dialect ); for ( PersistentClass entityBinding : entityBindingMap.values() ) { if ( entityBinding.isInherited() ) { @@ -2208,8 +2206,6 @@ private void processExportableProducers() { handleIdentifierValueBinding( entityBinding.getIdentifier(), dialect, - defaultCatalog, - defaultSchema, (RootClass) entityBinding ); } @@ -2222,8 +2218,6 @@ private void processExportableProducers() { handleIdentifierValueBinding( ( (IdentifierCollection) collection ).getIdentifier(), dialect, - defaultCatalog, - defaultSchema, null ); } @@ -2232,8 +2226,6 @@ private void processExportableProducers() { private void handleIdentifierValueBinding( KeyValue identifierValueBinding, Dialect dialect, - String defaultCatalog, - String defaultSchema, RootClass entityBinding) { // todo : store this result (back into the entity or into the KeyValue, maybe?) // This process of instantiating the id-generator is called multiple times. @@ -2243,8 +2235,6 @@ private void handleIdentifierValueBinding( final IdentifierGenerator ig = identifierValueBinding.createIdentifierGenerator( getIdentifierGeneratorFactory(), dialect, - defaultCatalog, - defaultSchema, entityBinding ); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java index 61f98f680e9a..6f44c9c7d2e7 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java @@ -499,17 +499,12 @@ public static class MappingDefaultsImpl implements MappingDefaults { public MappingDefaultsImpl(StandardServiceRegistry serviceRegistry) { final ConfigurationService configService = serviceRegistry.getService( ConfigurationService.class ); - this.implicitSchemaName = configService.getSetting( - AvailableSettings.DEFAULT_SCHEMA, - StandardConverters.STRING, - null - ); - - this.implicitCatalogName = configService.getSetting( - AvailableSettings.DEFAULT_CATALOG, - StandardConverters.STRING, - null - ); + // AvailableSettings.DEFAULT_SCHEMA and AvailableSettings.DEFAULT_CATALOG + // are taken into account later, at runtime, when rendering table/sequence names. + // These fields are exclusively about mapping defaults, + // overridden in XML mappings or through setters in MetadataBuilder. + this.implicitSchemaName = null; + this.implicitCatalogName = null; this.implicitlyQuoteIdentifiers = configService.getSetting( AvailableSettings.GLOBALLY_QUOTED_IDENTIFIERS, diff --git a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java index 704437008fc9..dfff98061cdd 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java @@ -82,7 +82,9 @@ import static org.hibernate.cfg.AvailableSettings.CRITERIA_LITERAL_HANDLING_MODE; import static org.hibernate.cfg.AvailableSettings.CUSTOM_ENTITY_DIRTINESS_STRATEGY; import static org.hibernate.cfg.AvailableSettings.DEFAULT_BATCH_FETCH_SIZE; +import static org.hibernate.cfg.AvailableSettings.DEFAULT_CATALOG; import static org.hibernate.cfg.AvailableSettings.DEFAULT_ENTITY_MODE; +import static org.hibernate.cfg.AvailableSettings.DEFAULT_SCHEMA; import static org.hibernate.cfg.AvailableSettings.DELAY_ENTITY_LOADER_CREATIONS; import static org.hibernate.cfg.AvailableSettings.ENABLE_LAZY_LOAD_NO_TRANS; import static org.hibernate.cfg.AvailableSettings.FAIL_ON_PAGINATION_OVER_COLLECTION_FETCH; @@ -242,6 +244,12 @@ public class SessionFactoryOptionsBuilder implements SessionFactoryOptions { private boolean queryParametersValidationEnabled; private LiteralHandlingMode criteriaLiteralHandlingMode; private ImmutableEntityUpdateQueryHandlingMode immutableEntityUpdateQueryHandlingMode; + // These two settings cannot be modified from the builder, + // in order to maintain consistency. + // Indeed, other components (the schema tools) also make use of these settings, + // and THOSE do not have access to session factory options. + private final String defaultCatalog; + private final String defaultSchema; private Map sqlFunctions; @@ -531,6 +539,9 @@ else if ( jdbcTimeZoneValue != null ) { configurationSettings.get( IMMUTABLE_ENTITY_UPDATE_QUERY_HANDLING_MODE ) ); + this.defaultCatalog = ConfigurationHelper.getString( DEFAULT_CATALOG, configurationSettings ); + this.defaultSchema = ConfigurationHelper.getString( DEFAULT_SCHEMA, configurationSettings ); + this.inClauseParameterPaddingEnabled = ConfigurationHelper.getBoolean( IN_CLAUSE_PARAMETER_PADDING, configurationSettings, @@ -1047,6 +1058,16 @@ public ImmutableEntityUpdateQueryHandlingMode getImmutableEntityUpdateQueryHandl return immutableEntityUpdateQueryHandlingMode; } + @Override + public String getDefaultCatalog() { + return defaultCatalog; + } + + @Override + public String getDefaultSchema() { + return defaultSchema; + } + @Override public boolean jdbcStyleParamsZeroBased() { return this.jdbcStyleParamsZeroBased; @@ -1092,7 +1113,6 @@ public boolean isOmitJoinOfSuperclassTablesEnabled() { return omitJoinOfSuperclassTablesEnabled; } - // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // In-flight mutation access diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java index 522fbb0bb480..fcd682ae7e44 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java @@ -6,6 +6,7 @@ */ package org.hibernate.boot.model.relational; +import org.hibernate.boot.model.naming.Identifier; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; @@ -27,6 +28,22 @@ public interface SqlStringGenerationContext { */ IdentifierHelper getIdentifierHelper(); + /** + * @return The default catalog, used for table/sequence names that do not explicitly mention a catalog. + * May be {@code null}. + * This default is generally applied automatically by the {@link #format(QualifiedName) format methods}, + * but in some cases it can be useful to access it directly. + */ + Identifier getDefaultCatalog(); + + /** + * @return The default schema, used for table/sequence names that do not explicitly mention a schema. + * May be {@code null}. + * This default is generally applied automatically by the {@link #format(QualifiedName) format methods}, + * but in some cases it can be useful to access it directly. + */ + Identifier getDefaultSchema(); + /** * Render a formatted a table name * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java index 6311ddc2779e..1b395e317e6c 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java @@ -6,31 +6,90 @@ */ package org.hibernate.boot.model.relational.internal; +import java.util.Map; + +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedName; import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; +import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport; import org.hibernate.engine.jdbc.env.spi.QualifiedObjectNameFormatter; public class SqlStringGenerationContextImpl implements SqlStringGenerationContext { + /** + * @param jdbcEnvironment The JDBC environment, to extract the dialect, identifier helper, etc. + * @param database The database metadata, to retrieve the implicit namespace name configured through XML mapping. + * @param configurationMap The configuration map, holding settings such as {@link AvailableSettings#DEFAULT_SCHEMA}. + * @return An {@link SqlStringGenerationContext}. + */ + public static SqlStringGenerationContext fromConfigurationMap(JdbcEnvironment jdbcEnvironment, + Database database, Map configurationMap) { + String defaultCatalog = (String) configurationMap.get( AvailableSettings.DEFAULT_CATALOG ); + String defaultSchema = (String) configurationMap.get( AvailableSettings.DEFAULT_SCHEMA ); + return fromExplicit( jdbcEnvironment, database, defaultCatalog, defaultSchema ); + } + + /** + * @param jdbcEnvironment The JDBC environment, to extract the dialect, identifier helper, etc. + * @param database The database metadata, to retrieve the implicit namespace name configured through XML mapping. + * @param defaultCatalog The default catalog to use, unless an implicit catalog was configured through XML mapping. + * @param defaultSchema The default schema to use, unless an implicit schema was configured through XML mapping. + * @return An {@link SqlStringGenerationContext}. + */ + public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment, + Database database, String defaultCatalog, String defaultSchema) { + Namespace.Name implicitNamespaceName = database.getDefaultNamespace().getPhysicalName(); + IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); + NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport(); + Identifier actualDefaultCatalog = null; + if ( nameQualifierSupport.supportsCatalogs() ) { + actualDefaultCatalog = implicitNamespaceName.getCatalog() != null + ? implicitNamespaceName.getCatalog() + : identifierHelper.toIdentifier( defaultCatalog ); + } + Identifier actualDefaultSchema = null; + if ( nameQualifierSupport.supportsSchemas() ) { + actualDefaultSchema = implicitNamespaceName.getSchema() != null + ? implicitNamespaceName.getSchema() + : identifierHelper.toIdentifier( defaultSchema ); + } + return new SqlStringGenerationContextImpl( jdbcEnvironment, actualDefaultCatalog, actualDefaultSchema ); + } + public static SqlStringGenerationContext forTests(JdbcEnvironment jdbcEnvironment) { - return new SqlStringGenerationContextImpl( jdbcEnvironment ); + return forTests( jdbcEnvironment, null, null ); + } + + public static SqlStringGenerationContext forTests(JdbcEnvironment jdbcEnvironment, + String defaultCatalog, String defaultSchema) { + IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); + return new SqlStringGenerationContextImpl( jdbcEnvironment, + identifierHelper.toIdentifier( defaultCatalog ), identifierHelper.toIdentifier( defaultSchema ) ); } private final Dialect dialect; private final IdentifierHelper identifierHelper; private final QualifiedObjectNameFormatter qualifiedObjectNameFormatter; + private final Identifier defaultCatalog; + private final Identifier defaultSchema; @SuppressWarnings("deprecation") - public SqlStringGenerationContextImpl(JdbcEnvironment jdbcEnvironment) { + private SqlStringGenerationContextImpl(JdbcEnvironment jdbcEnvironment, + Identifier defaultCatalog, Identifier defaultSchema) { this.dialect = jdbcEnvironment.getDialect(); this.identifierHelper = jdbcEnvironment.getIdentifierHelper(); this.qualifiedObjectNameFormatter = jdbcEnvironment.getQualifiedObjectNameFormatter(); + this.defaultCatalog = defaultCatalog; + this.defaultSchema = defaultSchema; } @Override @@ -43,19 +102,60 @@ public IdentifierHelper getIdentifierHelper() { return identifierHelper; } + @Override + public Identifier getDefaultCatalog() { + return defaultCatalog; + } + + @Override + public Identifier getDefaultSchema() { + return defaultSchema; + } + @Override public String format(QualifiedTableName qualifiedName) { - return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); + return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); } @Override public String format(QualifiedSequenceName qualifiedName) { - return qualifiedObjectNameFormatter.format( qualifiedName, dialect ); + return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); } @Override public String format(QualifiedName qualifiedName) { - return qualifiedObjectNameFormatter.format( 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 diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java index 3efebf2d3f62..5d63c44fcfe3 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java @@ -804,17 +804,13 @@ private void makeIdentifier( // YUCK! but cannot think of a clean way to do this given the string-config based scheme params.put( PersistentIdentifierGenerator.IDENTIFIER_NORMALIZER, objectNameNormalizer); - if ( database.getDefaultNamespace().getPhysicalName().getSchema() != null ) { - params.setProperty( - PersistentIdentifierGenerator.SCHEMA, - database.getDefaultNamespace().getPhysicalName().getSchema().render( database.getDialect() ) - ); + String implicitSchemaName = metadataBuildingContext.getMappingDefaults().getImplicitSchemaName(); + if ( implicitSchemaName != null ) { + params.setProperty( PersistentIdentifierGenerator.SCHEMA, implicitSchemaName ); } - if ( database.getDefaultNamespace().getPhysicalName().getCatalog() != null ) { - params.setProperty( - PersistentIdentifierGenerator.CATALOG, - database.getDefaultNamespace().getPhysicalName().getCatalog().render( database.getDialect() ) - ); + String implicitCatalogName = metadataBuildingContext.getMappingDefaults().getImplicitCatalogName(); + if ( implicitCatalogName != null ) { + params.setProperty( PersistentIdentifierGenerator.CATALOG, implicitCatalogName ); } params.putAll( generator.getParameters() ); @@ -2961,7 +2957,7 @@ private Identifier determineCatalogName(TableSpecificationSource tableSpecSource return database.toIdentifier( tableSpecSource.getExplicitCatalogName() ); } else { - return database.getDefaultNamespace().getName().getCatalog(); + return database.toIdentifier( metadataBuildingContext.getMappingDefaults().getImplicitCatalogName() ); } } @@ -2970,7 +2966,7 @@ private Identifier determineSchemaName(TableSpecificationSource tableSpecSource) return database.toIdentifier( tableSpecSource.getExplicitSchemaName() ); } else { - return database.getDefaultNamespace().getName().getSchema(); + return database.toIdentifier( metadataBuildingContext.getMappingDefaults().getImplicitSchemaName() ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryOptions.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryOptions.java index 1ac730e0e52c..84953eac45ab 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/AbstractDelegatingSessionFactoryOptions.java @@ -423,6 +423,16 @@ public ImmutableEntityUpdateQueryHandlingMode getImmutableEntityUpdateQueryHandl return delegate.getImmutableEntityUpdateQueryHandlingMode(); } + @Override + public String getDefaultCatalog() { + return delegate.getDefaultCatalog(); + } + + @Override + public String getDefaultSchema() { + return delegate.getDefaultSchema(); + } + @Override public boolean inClauseParameterPaddingEnabled() { return delegate.inClauseParameterPaddingEnabled(); diff --git a/hibernate-core/src/main/java/org/hibernate/boot/spi/SessionFactoryOptions.java b/hibernate-core/src/main/java/org/hibernate/boot/spi/SessionFactoryOptions.java index 93cb7516128e..30b3a761c2c1 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/spi/SessionFactoryOptions.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/spi/SessionFactoryOptions.java @@ -293,6 +293,26 @@ default ImmutableEntityUpdateQueryHandlingMode getImmutableEntityUpdateQueryHand return ImmutableEntityUpdateQueryHandlingMode.WARNING; } + /** + * The default catalog to use in generated SQL when a catalog wasn't specified in the mapping, + * neither explicitly nor implicitly (see the concept of implicit catalog in XML mapping). + * + * @return The default catalog to use. + */ + default String getDefaultCatalog() { + return null; + } + + /** + * The default schema to use in generated SQL when a catalog wasn't specified in the mapping, + * neither explicitly nor implicitly (see the concept of implicit schema in XML mapping). + * + * @return The default schema to use. + */ + default String getDefaultSchema() { + return null; + } + default boolean inClauseParameterPaddingEnabled() { return false; } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java index 244835656fce..3203190d9086 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java @@ -61,8 +61,8 @@ private static String extractName(Identifier identifier) { public Settings(SessionFactoryOptions sessionFactoryOptions, String defaultCatalogName, String defaultSchemaName) { this.sessionFactoryOptions = sessionFactoryOptions; - this.defaultCatalogName = defaultCatalogName; - this.defaultSchemaName = defaultSchemaName; + this.defaultCatalogName = defaultCatalogName != null ? defaultCatalogName : sessionFactoryOptions.getDefaultCatalog(); + this.defaultSchemaName = defaultSchemaName != null ? defaultSchemaName : sessionFactoryOptions.getDefaultSchema(); if ( LOG.isDebugEnabled() ) { LOG.debugf( "SessionFactory name : %s", sessionFactoryOptions.getSessionFactoryName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java index 2e5995f45647..2dfb2d132e87 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java @@ -477,10 +477,10 @@ public static Table buildAndFillTable( String subselect, InFlightMetadataCollector.EntityTableXref denormalizedSuperTableXref) { schema = BinderHelper.isEmptyOrNullAnnotationValue( schema ) - ? extract( buildingContext.getMetadataCollector().getDatabase().getDefaultNamespace().getPhysicalName().getSchema() ) + ? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitSchemaName() : schema; catalog = BinderHelper.isEmptyOrNullAnnotationValue( catalog ) - ? extract( buildingContext.getMetadataCollector().getDatabase().getDefaultNamespace().getPhysicalName().getCatalog() ) + ? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitCatalogName() : catalog; final Table table; diff --git a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java b/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java index c494da3c2029..33f169649b8e 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/FilterConfiguration.java @@ -59,9 +59,7 @@ public Map getAliasTableMap(SessionFactoryImplementor factory) { } else if ( persistentClass != null ) { String table = persistentClass.getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ); return Collections.singletonMap( null, table ); } diff --git a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java index 099de0dcb53c..6ee59ac1a42b 100644 --- a/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/internal/SessionFactoryImpl.java @@ -233,10 +233,11 @@ public SessionFactoryImpl( this.uuid = options.getUuid(); jdbcServices = serviceRegistry.getService( JdbcServices.class ); - sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcServices.getJdbcEnvironment() ); + + ConfigurationService configurationService = serviceRegistry.getService( ConfigurationService.class ); this.properties = new HashMap<>(); - this.properties.putAll( serviceRegistry.getService( ConfigurationService.class ).getSettings() ); + this.properties.putAll( configurationService.getSettings() ); if ( !properties.containsKey( AvailableSettings.JPA_VALIDATION_FACTORY ) && !properties.containsKey( AvailableSettings.JAKARTA_JPA_VALIDATION_FACTORY ) ) { if ( getSessionFactoryOptions().getValidatorFactoryReference() != null ) { @@ -254,6 +255,10 @@ public SessionFactoryImpl( maskOutSensitiveInformation(this.properties); logIfEmptyCompositesEnabled( this.properties ); + sqlStringGenerationContext = SqlStringGenerationContextImpl.fromExplicit( + jdbcServices.getJdbcEnvironment(), metadata.getDatabase(), + options.getDefaultCatalog(), options.getDefaultSchema() ); + this.sqlFunctionRegistry = new SQLFunctionRegistry( jdbcServices.getJdbcEnvironment().getDialect(), options.getCustomSqlFunctionMap() ); this.cacheAccess = this.serviceRegistry.getService( CacheImplementor.class ); this.criteriaBuilder = new CriteriaBuilderImpl( this ); @@ -301,8 +306,6 @@ public void sessionFactoryClosed(SessionFactory factory) { IdentifierGenerator generator = model.getIdentifier().createIdentifierGenerator( metadata.getIdentifierGeneratorFactory(), jdbcServices.getJdbcEnvironment().getDialect(), - settings.getDefaultCatalogName(), - settings.getDefaultSchemaName(), (RootClass) model ); generator.initialize( sqlStringGenerationContext ); diff --git a/hibernate-core/src/main/java/org/hibernate/loader/custom/sql/SQLQueryParser.java b/hibernate-core/src/main/java/org/hibernate/loader/custom/sql/SQLQueryParser.java index 73efc374e559..16add7c282b3 100755 --- a/hibernate-core/src/main/java/org/hibernate/loader/custom/sql/SQLQueryParser.java +++ b/hibernate-core/src/main/java/org/hibernate/loader/custom/sql/SQLQueryParser.java @@ -13,6 +13,8 @@ import java.util.regex.Pattern; import org.hibernate.QueryException; +import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.query.spi.ParameterParser; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.param.ParameterBinder; @@ -85,6 +87,8 @@ protected String substituteBrackets(String sqlQuery) throws QueryException { StringBuilder result = new StringBuilder( sqlQuery.length() + 20 ); int left, right; + SqlStringGenerationContext sqlStringGenerationContext = factory.getSqlStringGenerationContext(); + // replace {....} with corresponding column aliases for ( int curr = 0; curr < sqlQuery.length(); curr = right + 1 ) { if ( ( left = sqlQuery.indexOf( '{', curr ) ) < 0 ) { @@ -107,30 +111,30 @@ protected String substituteBrackets(String sqlQuery) throws QueryException { if ( isPlaceholder ) { // Domain replacement if ( DOMAIN_PLACEHOLDER.equals( aliasPath ) ) { - final String catalogName = factory.getSettings().getDefaultCatalogName(); + final Identifier catalogName = sqlStringGenerationContext.getDefaultCatalog(); if ( catalogName != null ) { - result.append( catalogName ); + result.append( catalogName.render( sqlStringGenerationContext.getDialect() ) ); result.append( "." ); } - final String schemaName = factory.getSettings().getDefaultSchemaName(); + final Identifier schemaName = sqlStringGenerationContext.getDefaultSchema(); if ( schemaName != null ) { - result.append( schemaName ); + result.append( schemaName.render( sqlStringGenerationContext.getDialect() ) ); result.append( "." ); } } // Schema replacement else if ( SCHEMA_PLACEHOLDER.equals( aliasPath ) ) { - final String schemaName = factory.getSettings().getDefaultSchemaName(); + final Identifier schemaName = sqlStringGenerationContext.getDefaultSchema(); if ( schemaName != null ) { - result.append(schemaName); + result.append( schemaName.render( sqlStringGenerationContext.getDialect() ) ); result.append("."); } } // Catalog replacement else if ( CATALOG_PLACEHOLDER.equals( aliasPath ) ) { - final String catalogName = factory.getSettings().getDefaultCatalogName(); + final Identifier catalogName = sqlStringGenerationContext.getDefaultCatalog(); if ( catalogName != null ) { - result.append( catalogName ); + result.append( catalogName.render( sqlStringGenerationContext.getDialect() ) ); result.append( "." ); } } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java b/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java index 85ab53899aff..37d68b6f00fc 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Constraint.java @@ -185,7 +185,7 @@ public String sqlDropString(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { Dialect dialect = context.getDialect(); if ( isGenerated( dialect ) ) { - final String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); + final String tableName = getTable().getQualifiedName( context ); return String.format( Locale.ROOT, "%s evictData constraint %s", @@ -208,7 +208,7 @@ public String sqlCreateString(Mapping p, SqlStringGenerationContext context, Str // empty string. Prevent blank "alter table" statements. String constraintString = sqlConstraintString( context, getName(), defaultCatalog, defaultSchema ); if ( !StringHelper.isEmpty( constraintString ) ) { - final String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); + final String tableName = getTable().getQualifiedName( context ); return dialect.getAlterTableString( tableName ) + " " + constraintString; } } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java b/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java index 3f309d1d4f9e..ffd3dc23784d 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/ForeignKey.java @@ -90,9 +90,7 @@ public String sqlConstraintString( constraintName, columnNames, referencedTable.getQualifiedName( - context, - defaultCatalog, - defaultSchema + context ), referencedColumnNames, isReferenceToPrimaryKey() @@ -179,7 +177,7 @@ public void setKeyDefinition(String keyDefinition) { public String sqlDropString(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { Dialect dialect = context.getDialect(); - String tableName = getTable().getQualifiedName( context, defaultCatalog, defaultSchema ); + String tableName = getTable().getQualifiedName( context ); final StringBuilder buf = new StringBuilder( dialect.getAlterTableString( tableName ) ); buf.append( dialect.getDropForeignKeyString() ); if ( dialect.supportsIfExistsBeforeConstraintName() ) { diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Index.java b/hibernate-core/src/main/java/org/hibernate/mapping/Index.java index cbc96c2ea023..c0937b19ff58 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Index.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Index.java @@ -55,7 +55,7 @@ public static String buildSqlDropIndexString( String name, String defaultCatalog, String defaultSchema) { - return buildSqlDropIndexString( name, table.getQualifiedName( context, defaultCatalog, defaultSchema ) ); + return buildSqlDropIndexString( name, table.getQualifiedName( context ) ); } public static String buildSqlDropIndexString( @@ -76,7 +76,7 @@ public static String buildSqlCreateIndexString( return buildSqlCreateIndexString( context.getDialect(), name, - table.getQualifiedName( context, defaultCatalog, defaultSchema ), + table.getQualifiedName( context ), columns, columnOrderMap, unique @@ -151,7 +151,7 @@ public String sqlDropString(SqlStringGenerationContext context, Dialect dialect = context.getDialect(); return "drop index " + StringHelper.qualify( - table.getQualifiedName( context, defaultCatalog, defaultSchema ), + table.getQualifiedName( context ), getQuotedName( dialect ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/KeyValue.java b/hibernate-core/src/main/java/org/hibernate/mapping/KeyValue.java index 8635fb99f630..bda09a04c4db 100755 --- a/hibernate-core/src/main/java/org/hibernate/mapping/KeyValue.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/KeyValue.java @@ -18,6 +18,11 @@ */ public interface KeyValue extends Value { + /** + * @deprecated Use {@link #createIdentifierGenerator(IdentifierGeneratorFactory, Dialect, RootClass)} + * instead. + */ + @Deprecated public IdentifierGenerator createIdentifierGenerator( IdentifierGeneratorFactory identifierGeneratorFactory, Dialect dialect, @@ -25,6 +30,11 @@ public IdentifierGenerator createIdentifierGenerator( String defaultSchema, RootClass rootClass) throws MappingException; + IdentifierGenerator createIdentifierGenerator( + IdentifierGeneratorFactory identifierGeneratorFactory, + Dialect dialect, + RootClass rootClass) throws MappingException; + public boolean isIdentityColumn(IdentifierGeneratorFactory identifierGeneratorFactory, Dialect dialect); public void createForeignKeyOfEntity(String entityName); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/SimpleValue.java b/hibernate-core/src/main/java/org/hibernate/mapping/SimpleValue.java index da3afbe33ea5..97fac7f3ab61 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/SimpleValue.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/SimpleValue.java @@ -52,13 +52,9 @@ import org.hibernate.type.descriptor.converter.AttributeConverterSqlTypeDescriptorAdapter; import org.hibernate.type.descriptor.converter.AttributeConverterTypeAdapter; import org.hibernate.type.descriptor.java.BasicJavaDescriptor; -import org.hibernate.type.descriptor.java.JavaTypeDescriptor; -import org.hibernate.type.descriptor.spi.JdbcRecommendedSqlTypeMappingContext; -import org.hibernate.type.descriptor.sql.JdbcTypeJavaClassMappings; import org.hibernate.type.descriptor.sql.LobTypeMappings; import org.hibernate.type.descriptor.sql.NationalizedTypeMappings; import org.hibernate.type.descriptor.sql.SqlTypeDescriptor; -import org.hibernate.type.spi.TypeConfiguration; import org.hibernate.usertype.DynamicParameterizedType; /** @@ -276,6 +272,14 @@ public IdentifierGenerator getIdentifierGenerator() { return identifierGenerator; } + @Override + public IdentifierGenerator createIdentifierGenerator( + IdentifierGeneratorFactory identifierGeneratorFactory, + Dialect dialect, + RootClass rootClass) throws MappingException { + return createIdentifierGenerator( identifierGeneratorFactory, dialect, null, null, rootClass ); + } + @Override public IdentifierGenerator createIdentifierGenerator( IdentifierGeneratorFactory identifierGeneratorFactory, @@ -289,18 +293,17 @@ public IdentifierGenerator createIdentifierGenerator( } Properties params = new Properties(); - - //if the hibernate-mapping did not specify a schema/catalog, use the defaults - //specified by properties - but note that if the schema/catalog were specified - //in hibernate-mapping, or as params, they will already be initialized and - //will override the values set here (they are in identifierGeneratorProperties) + + // This is for backwards compatibility only; + // when this method is called by Hibernate ORM, defaultSchema and defaultCatalog are always + // null, and defaults are handled later. if ( defaultSchema!=null ) { params.setProperty(PersistentIdentifierGenerator.SCHEMA, defaultSchema); } if ( defaultCatalog!=null ) { params.setProperty(PersistentIdentifierGenerator.CATALOG, defaultCatalog); } - + //pass the entity-name, if not a collection-id if (rootClass!=null) { params.setProperty( IdentifierGenerator.ENTITY_NAME, rootClass.getEntityName() ); diff --git a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java index 8f802ce637df..827058d65202 100644 --- a/hibernate-core/src/main/java/org/hibernate/mapping/Table.java +++ b/hibernate-core/src/main/java/org/hibernate/mapping/Table.java @@ -28,7 +28,6 @@ import org.hibernate.boot.model.relational.QualifiedTableName; import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.IdentifierHelper; import org.hibernate.engine.spi.Mapping; import org.hibernate.tool.hbm2ddl.ColumnMetadata; import org.hibernate.tool.hbm2ddl.TableMetadata; @@ -113,18 +112,11 @@ public Table(Namespace namespace, String subselect, boolean isAbstract) { this.isAbstract = isAbstract; } - public String getQualifiedName(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { + public String getQualifiedName(SqlStringGenerationContext context) { if ( subselect != null ) { return "( " + subselect + " )"; } - IdentifierHelper identifierHelper = context.getIdentifierHelper(); - Identifier usedSchema = schema == null ? - identifierHelper.toIdentifier( defaultSchema ) : - schema; - Identifier usedCatalog = catalog == null ? - identifierHelper.toIdentifier( defaultCatalog ) : - catalog; - return context.format( new QualifiedTableName( usedCatalog, usedSchema, name ) ); + return context.format( new QualifiedTableName( catalog, schema, name ) ); } /** @@ -441,16 +433,8 @@ public Iterator sqlAlterStrings( Dialect dialect, Metadata metadata, TableInformation tableInfo, - Identifier defaultCatalog, - Identifier defaultSchema, SqlStringGenerationContext sqlStringGenerationContext) throws HibernateException { - final String tableName = sqlStringGenerationContext.format( - new QualifiedTableName( - catalog != null ? catalog : defaultCatalog, - schema != null ? schema : defaultSchema, - name - ) - ); + final String tableName = sqlStringGenerationContext.format( new QualifiedTableName( catalog, schema, name ) ); StringBuilder root = new StringBuilder( dialect.getAlterTableString( tableName ) ) .append( ' ' ) @@ -526,7 +510,7 @@ public String sqlCreateString(Mapping p, SqlStringGenerationContext context, Str Dialect dialect = context.getDialect(); StringBuilder buf = new StringBuilder( hasPrimaryKey() ? dialect.getCreateTableString() : dialect.getCreateMultisetTableString() ) .append( ' ' ) - .append( getQualifiedName( context, defaultCatalog, defaultSchema ) ) + .append( getQualifiedName( context ) ) .append( " (" ); boolean identityColumn = idValue != null && idValue.isIdentityColumn( p.getIdentifierGeneratorFactory(), dialect ); @@ -621,7 +605,7 @@ public String sqlCreateString(Mapping p, SqlStringGenerationContext context, Str @Override public String sqlDropString(SqlStringGenerationContext context, String defaultCatalog, String defaultSchema) { Dialect dialect = context.getDialect(); - return dialect.getDropTableString( getQualifiedName( context, defaultCatalog, defaultSchema ) ); + return dialect.getDropTableString( getQualifiedName( context ) ); } public PrimaryKey getPrimaryKey() { diff --git a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java index 79252658cf60..81c5ec033306 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/collection/AbstractCollectionPersister.java @@ -454,8 +454,6 @@ public AbstractCollectionPersister( identifierGenerator = idColl.getIdentifier().createIdentifierGenerator( creationContext.getMetadata().getIdentifierGeneratorFactory(), factory.getDialect(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName(), null ); identifierGenerator.initialize( creationContext.getSessionFactory().getSqlStringGenerationContext() ); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java index 9a5712d55eba..64da81c8e03a 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/JoinedSubclassEntityPersister.java @@ -13,7 +13,6 @@ import org.hibernate.boot.model.relational.Database; import org.hibernate.cache.spi.access.EntityDataAccess; import org.hibernate.cache.spi.access.NaturalIdDataAccess; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.internal.DynamicFilterAliasGenerator; @@ -439,9 +438,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { while ( iter.hasNext() ) { Property prop = (Property) iter.next(); String tabname = prop.getValue().getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ); propertyTableNumbers[i] = getTableId( tabname, this.tableNames ); naturalOrderPropertyTableNumbers[i] = getTableId( tabname, naturalOrderTableNames ); @@ -461,9 +458,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { Property prop = (Property) iter.next(); Table tab = prop.getValue().getTable(); String tabname = tab.getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ); Integer tabnum = getTableId( tabname, subclassTableNameClosure ); propTableNumbers.add( tabnum ); @@ -497,9 +492,7 @@ else if ( persistentClass.isDiscriminatorValueNotNull() ) { notNullColumnTableNumbers = new int[subclassSpan]; final int id = getTableId( persistentClass.getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ), subclassTableNameClosure ); @@ -551,9 +544,7 @@ else if ( sc.isDiscriminatorValueNotNull() ) { discriminatorValues[k] = discriminatorValue.toString(); int id = getTableId( sc.getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ), subclassTableNameClosure ); @@ -676,9 +667,7 @@ private void associateSubclassNamesToSubclassTableIndexes( SessionFactoryImplementor factory) { final String tableName = persistentClass.getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ); associateSubclassNamesToSubclassTableIndex( tableName, classNames, mapping ); @@ -687,9 +676,7 @@ private void associateSubclassNamesToSubclassTableIndexes( while ( itr.hasNext() ) { final Join join = (Join) itr.next(); final String secondaryTableName = join.getTable().getQualifiedName( - factory.getSqlStringGenerationContext(), - factory.getSettings().getDefaultCatalogName(), - factory.getSettings().getDefaultSchemaName() + factory.getSqlStringGenerationContext() ); associateSubclassNamesToSubclassTableIndex( secondaryTableName, classNames, mapping ); } diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java index ac8331ff20d0..5d50cca35865 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/UnionSubclassEntityPersister.java @@ -25,7 +25,6 @@ import org.hibernate.cache.spi.access.NaturalIdDataAccess; import org.hibernate.cfg.Settings; import org.hibernate.dialect.Dialect; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.spi.ExecuteUpdateResultCheckStyle; import org.hibernate.engine.spi.Mapping; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -367,9 +366,7 @@ protected String generateSubquery(PersistentClass model, Mapping mapping) { if ( !model.hasSubclasses() ) { return model.getTable().getQualifiedName( - sqlStringGenerationContext, - settings.getDefaultCatalogName(), - settings.getDefaultSchemaName() + sqlStringGenerationContext ); } @@ -415,9 +412,7 @@ protected String generateSubquery(PersistentClass model, Mapping mapping) { buf.append( " from " ) .append( table.getQualifiedName( - sqlStringGenerationContext, - settings.getDefaultCatalogName(), - settings.getDefaultSchemaName() + sqlStringGenerationContext ) ); buf.append( " union " ); diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java index 9af4d368df98..38748838b128 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java @@ -14,6 +14,7 @@ import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.QualifiedSequenceName; import org.hibernate.boot.model.relational.QualifiedTableName; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.resource.transaction.spi.DdlTransactionIsolator; import org.hibernate.service.ServiceRegistry; @@ -39,16 +40,15 @@ public class DatabaseInformationImpl public DatabaseInformationImpl( ServiceRegistry serviceRegistry, JdbcEnvironment jdbcEnvironment, + SqlStringGenerationContext sqlStringGenerationContext, DdlTransactionIsolator ddlTransactionIsolator, - Namespace.Name defaultNamespace, SchemaManagementTool tool) throws SQLException { this.jdbcEnvironment = jdbcEnvironment; this.extractionContext = tool.getExtractionTool().createExtractionContext( serviceRegistry, jdbcEnvironment, + sqlStringGenerationContext, ddlTransactionIsolator, - defaultNamespace.getCatalog(), - defaultNamespace.getSchema(), this ); diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java index 1af9e2c66f65..2dd8d5365347 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/ExtractionContextImpl.java @@ -12,7 +12,6 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.SqlStringGenerationContext; -import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.service.ServiceRegistry; @@ -27,8 +26,6 @@ public class ExtractionContextImpl implements ExtractionContext { private final SqlStringGenerationContext sqlStringGenerationContext; private final JdbcConnectionAccess jdbcConnectionAccess; private final DatabaseObjectAccess registeredTableAccess; - private final Identifier defaultCatalogName; - private final Identifier defaultSchemaName; private Connection jdbcConnection; private DatabaseMetaData jdbcDatabaseMetaData; @@ -36,17 +33,14 @@ public class ExtractionContextImpl implements ExtractionContext { public ExtractionContextImpl( ServiceRegistry serviceRegistry, JdbcEnvironment jdbcEnvironment, + SqlStringGenerationContext sqlStringGenerationContext, JdbcConnectionAccess jdbcConnectionAccess, - DatabaseObjectAccess registeredTableAccess, - Identifier defaultCatalogName, - Identifier defaultSchemaName) { + DatabaseObjectAccess registeredTableAccess) { this.serviceRegistry = serviceRegistry; this.jdbcEnvironment = jdbcEnvironment; - this.sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcEnvironment ); + this.sqlStringGenerationContext = sqlStringGenerationContext; this.jdbcConnectionAccess = jdbcConnectionAccess; this.registeredTableAccess = registeredTableAccess; - this.defaultCatalogName = defaultCatalogName; - this.defaultSchemaName = defaultSchemaName; } @Override @@ -92,12 +86,12 @@ public DatabaseMetaData getJdbcDatabaseMetaData() { @Override public Identifier getDefaultCatalog() { - return defaultCatalogName; + return sqlStringGenerationContext.getDefaultCatalog(); } @Override public Identifier getDefaultSchema() { - return defaultSchemaName; + return sqlStringGenerationContext.getDefaultSchema(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java index e91b829034fc..815febc060e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaMigrator.java @@ -28,6 +28,7 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.config.spi.ConfigurationService; import org.hibernate.engine.config.spi.StandardConverters; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.internal.FormatStyle; import org.hibernate.engine.jdbc.internal.Formatter; import org.hibernate.internal.util.StringHelper; @@ -91,6 +92,11 @@ public void setUniqueConstraintStrategy(UniqueConstraintSchemaUpdateStrategy uni @Override public void doMigration(Metadata metadata, ExecutionOptions options, TargetDescriptor targetDescriptor) { + SqlStringGenerationContext sqlStringGenerationContext = SqlStringGenerationContextImpl.fromConfigurationMap( + tool.getServiceRegistry().getService( JdbcEnvironment.class ), + metadata.getDatabase(), + options.getConfigurationValues() + ); if ( !targetDescriptor.getTargetTypes().isEmpty() ) { final JdbcContext jdbcContext = tool.resolveJdbcContext( options.getConfigurationValues() ); final DdlTransactionIsolator ddlTransactionIsolator = tool.getDdlTransactionIsolator( jdbcContext ); @@ -98,7 +104,7 @@ public void doMigration(Metadata metadata, ExecutionOptions options, TargetDescr final DatabaseInformation databaseInformation = Helper.buildDatabaseInformation( tool.getServiceRegistry(), ddlTransactionIsolator, - metadata.getDatabase().getDefaultNamespace().getName(), + sqlStringGenerationContext, tool ); @@ -114,7 +120,8 @@ public void doMigration(Metadata metadata, ExecutionOptions options, TargetDescr } try { - performMigration( metadata, databaseInformation, options, jdbcContext.getDialect(), targets ); + performMigration( metadata, databaseInformation, options, jdbcContext.getDialect(), + sqlStringGenerationContext, targets ); } finally { for ( GenerationTarget target : targets ) { @@ -161,6 +168,7 @@ private void performMigration( DatabaseInformation existingDatabase, ExecutionOptions options, Dialect dialect, + SqlStringGenerationContext sqlStringGenerationContext, GenerationTarget... targets) { final boolean format = Helper.interpretFormattingEnabled( options.getConfigurationValues() ); final Formatter formatter = format ? FormatStyle.DDL.getFormatter() : FormatStyle.NONE.getFormatter(); @@ -168,8 +176,6 @@ private void performMigration( final Set exportIdentifiers = new HashSet( 50 ); final Database database = metadata.getDatabase(); - SqlStringGenerationContext sqlStringGenerationContext = - new SqlStringGenerationContextImpl( database.getJdbcEnvironment() ); // Drop all AuxiliaryDatabaseObjects for ( AuxiliaryDatabaseObject auxiliaryDatabaseObject : database.getAuxiliaryDatabaseObjects() ) { @@ -311,8 +317,6 @@ protected void migrateTable( dialect, metadata, tableInformation, - database.getDefaultNamespace().getPhysicalName().getCatalog(), - database.getDefaultNamespace().getPhysicalName().getSchema(), sqlStringGenerationContext ), formatter, diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaValidator.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaValidator.java index ffe60ab61686..4b86bf903955 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaValidator.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/AbstractSchemaValidator.java @@ -13,7 +13,10 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.Namespace; import org.hibernate.boot.model.relational.Sequence; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.dialect.Dialect; +import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.mapping.Column; import org.hibernate.mapping.Selectable; import org.hibernate.mapping.Table; @@ -54,13 +57,18 @@ public AbstractSchemaValidator( @Override public void doValidation(Metadata metadata, ExecutionOptions options) { + SqlStringGenerationContext sqlStringGenerationContext = SqlStringGenerationContextImpl.fromConfigurationMap( + tool.getServiceRegistry().getService( JdbcEnvironment.class ), + metadata.getDatabase(), + options.getConfigurationValues() + ); final JdbcContext jdbcContext = tool.resolveJdbcContext( options.getConfigurationValues() ); final DdlTransactionIsolator isolator = tool.getDdlTransactionIsolator( jdbcContext ); final DatabaseInformation databaseInformation = Helper.buildDatabaseInformation( tool.getServiceRegistry(), isolator, - metadata.getDatabase().getDefaultNamespace().getName(), + sqlStringGenerationContext, tool ); diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/Helper.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/Helper.java index 131a961a074a..b09c9993586a 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/Helper.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/Helper.java @@ -14,7 +14,7 @@ import java.util.Map; import java.util.regex.Pattern; -import org.hibernate.boot.model.relational.Namespace; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; import org.hibernate.cfg.AvailableSettings; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; @@ -176,15 +176,15 @@ public static boolean interpretFormattingEnabled(Map configurationValues) { public static DatabaseInformation buildDatabaseInformation( ServiceRegistry serviceRegistry, DdlTransactionIsolator ddlTransactionIsolator, - Namespace.Name defaultNamespace, + SqlStringGenerationContext sqlStringGenerationContext, SchemaManagementTool tool) { final JdbcEnvironment jdbcEnvironment = serviceRegistry.getService( JdbcEnvironment.class ); try { return new DatabaseInformationImpl( serviceRegistry, jdbcEnvironment, + sqlStringGenerationContext, ddlTransactionIsolator, - defaultNamespace, tool ); } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/HibernateSchemaManagementTool.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/HibernateSchemaManagementTool.java index 7741de5d8f5f..e6d5b97f0fee 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/HibernateSchemaManagementTool.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/HibernateSchemaManagementTool.java @@ -10,6 +10,7 @@ import java.util.Map; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.boot.registry.selector.spi.StrategySelector; import org.hibernate.cfg.AvailableSettings; import org.hibernate.dialect.Dialect; @@ -375,16 +376,14 @@ private HibernateExtractionTool() { public ExtractionContext createExtractionContext( ServiceRegistry serviceRegistry, JdbcEnvironment jdbcEnvironment, + SqlStringGenerationContext sqlStringGenerationContext, DdlTransactionIsolator ddlTransactionIsolator, - Identifier defaultCatalog, - Identifier defaultSchema, ExtractionContext.DatabaseObjectAccess databaseObjectAccess) { return new ImprovedExtractionContextImpl( serviceRegistry, jdbcEnvironment, + sqlStringGenerationContext, ddlTransactionIsolator, - defaultCatalog, - defaultSchema, databaseObjectAccess ); } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java index 63dbca8351f1..0d14dcabf768 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java @@ -218,8 +218,9 @@ public void createFromMetadata( } final Database database = metadata.getDatabase(); - SqlStringGenerationContext sqlStringGenerationContext = - new SqlStringGenerationContextImpl( database.getJdbcEnvironment() ); + final JdbcEnvironment jdbcEnvironment = database.getJdbcEnvironment(); + SqlStringGenerationContext sqlStringGenerationContext = SqlStringGenerationContextImpl.fromConfigurationMap( + jdbcEnvironment, database, options.getConfigurationValues() ); final Set exportIdentifiers = new HashSet( 50 ); diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java index f39e582d2368..753e95f3fd99 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaDropperImpl.java @@ -189,8 +189,8 @@ private void dropFromMetadata( Formatter formatter, GenerationTarget... targets) { final Database database = metadata.getDatabase(); - SqlStringGenerationContext sqlStringGenerationContext = - new SqlStringGenerationContextImpl( metadata.getDatabase().getJdbcEnvironment() ); + SqlStringGenerationContext sqlStringGenerationContext = SqlStringGenerationContextImpl.fromConfigurationMap( + metadata.getDatabase().getJdbcEnvironment(), database, options.getConfigurationValues()); boolean tryToDropCatalogs = false; boolean tryToDropSchemas = false; diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java index 20a56f55e850..479419e0ab89 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/exec/ImprovedExtractionContextImpl.java @@ -12,7 +12,6 @@ import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.model.relational.SqlStringGenerationContext; -import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.resource.transaction.spi.DdlTransactionIsolator; import org.hibernate.service.ServiceRegistry; @@ -26,8 +25,6 @@ public class ImprovedExtractionContextImpl implements ExtractionContext { private final JdbcEnvironment jdbcEnvironment; private final SqlStringGenerationContext sqlStringGenerationContext; private final DdlTransactionIsolator ddlTransactionIsolator; - private final Identifier defaultCatalog; - private final Identifier defaultSchema; private final DatabaseObjectAccess databaseObjectAccess; @@ -36,16 +33,13 @@ public class ImprovedExtractionContextImpl implements ExtractionContext { public ImprovedExtractionContextImpl( ServiceRegistry serviceRegistry, JdbcEnvironment jdbcEnvironment, + SqlStringGenerationContext sqlStringGenerationContext, DdlTransactionIsolator ddlTransactionIsolator, - Identifier defaultCatalog, - Identifier defaultSchema, DatabaseObjectAccess databaseObjectAccess) { this.serviceRegistry = serviceRegistry; this.jdbcEnvironment = jdbcEnvironment; - this.sqlStringGenerationContext = new SqlStringGenerationContextImpl( jdbcEnvironment ); + this.sqlStringGenerationContext = sqlStringGenerationContext; this.ddlTransactionIsolator = ddlTransactionIsolator; - this.defaultCatalog = defaultCatalog; - this.defaultSchema = defaultSchema; this.databaseObjectAccess = databaseObjectAccess; } @@ -87,12 +81,12 @@ public DatabaseMetaData getJdbcDatabaseMetaData() { @Override public Identifier getDefaultCatalog() { - return defaultCatalog; + return sqlStringGenerationContext.getDefaultCatalog(); } @Override public Identifier getDefaultSchema() { - return defaultSchema; + return sqlStringGenerationContext.getDefaultSchema(); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/ExtractionTool.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/ExtractionTool.java index e0b35cd58d4b..6a38c73620d2 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/ExtractionTool.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/spi/ExtractionTool.java @@ -8,6 +8,7 @@ import org.hibernate.Incubating; import org.hibernate.boot.model.naming.Identifier; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.resource.transaction.spi.DdlTransactionIsolator; import org.hibernate.service.ServiceRegistry; @@ -26,9 +27,8 @@ public interface ExtractionTool { ExtractionContext createExtractionContext( ServiceRegistry serviceRegistry, JdbcEnvironment jdbcEnvironment, + SqlStringGenerationContext sqlStringGenerationContext, DdlTransactionIsolator ddlTransactionIsolator, - Identifier defaultCatalog, - Identifier defaultSchema, ExtractionContext.DatabaseObjectAccess databaseObjectAccess); InformationExtractor createInformationExtractor(ExtractionContext extractionContext); diff --git a/hibernate-core/src/test/java/org/hibernate/test/schematools/TestExtraPhysicalTableTypes.java b/hibernate-core/src/test/java/org/hibernate/test/schematools/TestExtraPhysicalTableTypes.java index 7a5a6d0b637d..986674b46b1c 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/schematools/TestExtraPhysicalTableTypes.java +++ b/hibernate-core/src/test/java/org/hibernate/test/schematools/TestExtraPhysicalTableTypes.java @@ -11,13 +11,14 @@ import org.hibernate.boot.MetadataSources; import org.hibernate.boot.model.relational.Database; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; +import org.hibernate.boot.model.relational.internal.SqlStringGenerationContextImpl; import org.hibernate.boot.registry.StandardServiceRegistry; import org.hibernate.boot.registry.StandardServiceRegistryBuilder; import org.hibernate.boot.spi.MetadataImplementor; import org.hibernate.cfg.Environment; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator; -import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment; import org.hibernate.engine.jdbc.spi.JdbcServices; import org.hibernate.resource.transaction.spi.DdlTransactionIsolator; import org.hibernate.tool.schema.extract.internal.DatabaseInformationImpl; @@ -25,7 +26,6 @@ import org.hibernate.tool.schema.extract.internal.InformationExtractorJdbcDatabaseMetaDataImpl; import org.hibernate.tool.schema.extract.spi.DatabaseInformation; import org.hibernate.tool.schema.extract.spi.ExtractionContext; -import org.hibernate.tool.schema.internal.exec.ImprovedExtractionContextImpl; import org.hibernate.tool.schema.internal.exec.JdbcContext; import org.hibernate.tool.schema.spi.SchemaManagementTool; @@ -121,21 +121,23 @@ private InformationExtractorJdbcDatabaseMetaDataImplTest buildInformationExtract throws SQLException { Database database = metadata.getDatabase(); + SqlStringGenerationContext sqlStringGenerationContext = + SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + DatabaseInformation dbInfo = new DatabaseInformationImpl( ssr, database.getJdbcEnvironment(), + sqlStringGenerationContext, ddlTransactionIsolator, - database.getDefaultNamespace().getName(), database.getServiceRegistry().getService( SchemaManagementTool.class ) ); ExtractionContextImpl extractionContext = new ExtractionContextImpl( ssr, database.getJdbcEnvironment(), + sqlStringGenerationContext, ssr.getService( JdbcServices.class ).getBootstrapJdbcConnectionAccess(), - (ExtractionContext.DatabaseObjectAccess) dbInfo, - database.getDefaultNamespace().getPhysicalName().getCatalog(), - database.getDefaultNamespace().getPhysicalName().getSchema() + (ExtractionContext.DatabaseObjectAccess) dbInfo ); return new InformationExtractorJdbcDatabaseMetaDataImplTest( diff --git a/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java index 1d4f1ee5e2d3..b3588d3e2225 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/schemaupdate/SchemaUpdateTableBackedSequenceTest.java @@ -78,7 +78,7 @@ public void testCreateTableOnUpdate() throws SQLException { // lets make sure the InitCommand is there assertEquals( 1, database.getDefaultNamespace().getTables().size() ); Table table = database.getDefaultNamespace().getTables().iterator().next(); - SqlStringGenerationContext context = SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment() ); + SqlStringGenerationContext context = SqlStringGenerationContextImpl.forTests( database.getJdbcEnvironment(), null, null ); assertEquals( 1, table.getInitCommands( context ).size() ); final TargetImpl target = new TargetImpl(); From 1ee0e2e338cab26c8af84916afe2500ff565142f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 5 Nov 2021 13:35:47 +0100 Subject: [PATCH 012/256] HHH-14921 Test handling of default catalog and schema --- .../org/hibernate/id/IncrementGenerator.java | 8 + .../org/hibernate/id/SequenceGenerator.java | 8 + .../id/enhanced/DatabaseStructure.java | 8 + .../id/enhanced/SequenceStructure.java | 5 + .../hibernate/id/enhanced/TableGenerator.java | 8 + .../hibernate/id/enhanced/TableStructure.java | 5 + .../entity/AbstractEntityPersister.java | 8 + .../DefaultCatalogAndSchemaTest.java | 1190 +++++++++++++++++ ...icit-file-level-catalog-and-schema.hbm.xml | 17 + ...icit-file-level-catalog-and-schema.orm.xml | 46 + ...implicit-global-catalog-and-schema.orm.xml | 19 + 11 files changed, 1322 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java create mode 100644 hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.hbm.xml create mode 100644 hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.orm.xml create mode 100644 hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-global-catalog-and-schema.orm.xml diff --git a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java index 4a3ca87b6549..bfb9ccf51fbe 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/IncrementGenerator.java @@ -54,6 +54,14 @@ public class IncrementGenerator implements IdentifierGenerator { private IntegralDataTypeHolder previousValueHolder; + /** + * @deprecated Exposed for tests only. + */ + @Deprecated + public String[] getAllSqlForTests() { + return new String[] { sql }; + } + @Override public synchronized Serializable generate(SharedSessionContractImplementor session, Object object) throws HibernateException { if ( sql != null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java index 4058c906f2b4..d480034c5dcd 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/SequenceGenerator.java @@ -75,6 +75,14 @@ public QualifiedName getPhysicalSequenceName() { return physicalSequenceName; } + /** + * @deprecated Exposed for tests only. + */ + @Deprecated + public String[] getAllSqlForTests() { + return new String[] { sql }; + } + @Override @SuppressWarnings("StatementWithEmptyBody") public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java index edbf54eb08db..80b493ed5e8c 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/DatabaseStructure.java @@ -107,4 +107,12 @@ default void initialize(SqlStringGenerationContext context) { * @return {@code true} if the actual database structure is a sequence; {@code false} otherwise. */ boolean isPhysicalSequence(); + + /** + * @deprecated Exposed for tests only. + */ + @Deprecated + public default String[] getAllSqlForTests() { + return new String[] { }; + } } diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java index 330f6a6577ec..fe3051fae5b9 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/SequenceStructure.java @@ -78,6 +78,11 @@ public int getInitialValue() { return initialValue; } + @Override + public String[] getAllSqlForTests() { + return new String[] { sql }; + } + @Override public AccessCallback buildCallback(final SharedSessionContractImplementor session) { if ( sql == null ) { diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java index 509fc4cc5cd1..250d7c26d635 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableGenerator.java @@ -350,6 +350,14 @@ public final long getTableAccessCount() { return accessCount; } + /** + * @deprecated Exposed for tests only. + */ + @Deprecated + public String[] getAllSqlForTests() { + return new String[] { selectQuery, insertQuery, updateQuery }; + } + @Override public void configure(Type type, Properties params, ServiceRegistry serviceRegistry) throws MappingException { storeLastUsedValue = serviceRegistry.getService( ConfigurationService.class ) diff --git a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java index 17c44e9002b4..e9924fe01708 100644 --- a/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java +++ b/hibernate-core/src/main/java/org/hibernate/id/enhanced/TableStructure.java @@ -98,6 +98,11 @@ public int getTimesAccessed() { return accessCounter; } + @Override + public String[] getAllSqlForTests() { + return new String[] { selectQuery, updateQuery }; + } + @Override public void prepare(Optimizer optimizer) { applyIncrementSizeToSourceValues = optimizer.applyIncrementSizeToSourceValues(); diff --git a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java index 4ac395e1c5b3..366450c3048b 100644 --- a/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java +++ b/hibernate-core/src/main/java/org/hibernate/persister/entity/AbstractEntityPersister.java @@ -5045,6 +5045,14 @@ public IdentifierGenerator getIdentifierGenerator() throws HibernateException { return entityMetamodel.getIdentifierProperty().getIdentifierGenerator(); } + /** + * @deprecated Exposed for tests only + */ + @Deprecated + public InsertGeneratedIdentifierDelegate getIdentityDelegate() { + return identityDelegate; + } + public String getRootEntityName() { return entityMetamodel.getRootName(); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java new file mode 100644 index 000000000000..dd78d99cf77c --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java @@ -0,0 +1,1190 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later + * See the lgpl.txt file in the root directory or http://www.gnu.org/licenses/lgpl-2.1.html + */ +package org.hibernate.test.boot.database.qualfiedTableNaming; + +import static org.assertj.core.api.Assertions.assertThat; + +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; +import javax.persistence.Basic; +import javax.persistence.ElementCollection; +import javax.persistence.Entity; +import javax.persistence.ForeignKey; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.JoinTable; +import javax.persistence.OneToMany; +import javax.persistence.SequenceGenerator; +import javax.persistence.Table; +import javax.persistence.TableGenerator; + +import org.hibernate.MappingException; +import org.hibernate.annotations.GenericGenerator; +import org.hibernate.annotations.Parameter; +import org.hibernate.annotations.SQLDelete; +import org.hibernate.annotations.SQLInsert; +import org.hibernate.annotations.SQLUpdate; +import org.hibernate.boot.MetadataBuilder; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.SessionFactoryBuilder; +import org.hibernate.boot.registry.BootstrapServiceRegistry; +import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; +import org.hibernate.boot.registry.StandardServiceRegistry; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.boot.spi.MetadataImplementor; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.cfg.Environment; +import org.hibernate.dialect.SQLServer2012Dialect; +import org.hibernate.engine.config.spi.ConfigurationService; +import org.hibernate.engine.jdbc.env.spi.NameQualifierSupport; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.hql.spi.id.global.GlobalTemporaryTableBulkIdStrategy; +import org.hibernate.hql.spi.id.local.LocalTemporaryTableBulkIdStrategy; +import org.hibernate.id.IdentifierGenerator; +import org.hibernate.persister.entity.AbstractEntityPersister; +import org.hibernate.persister.entity.EntityPersister; +import org.hibernate.service.spi.ServiceRegistryImplementor; +import org.hibernate.tool.hbm2ddl.SchemaExport; +import org.hibernate.tool.schema.TargetType; +import org.hibernate.tool.schema.internal.exec.ScriptTargetOutputToWriter; +import org.hibernate.tool.schema.spi.DelayedDropRegistryNotAvailableImpl; +import org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator; +import org.hibernate.tool.schema.spi.ScriptTargetOutput; +import org.hibernate.tool.schema.spi.TargetDescriptor; + +import org.hibernate.testing.AfterClassOnce; +import org.hibernate.testing.BeforeClassOnce; +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.jdbc.SharedDriverManagerConnectionProviderImpl; +import org.hibernate.testing.junit4.CustomParameterized; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(CustomParameterized.class) +@TestForIssue(jiraKey = "HHH-14921") +public class DefaultCatalogAndSchemaTest { + + private static final String SQL_QUOTE_CHARACTER_CLASS = "([`\"]|\\[|\\])"; + + private static final String EXPLICIT_CATALOG = "someExplicitCatalog"; + private static final String EXPLICIT_SCHEMA = "someExplicitSchema"; + + // Yes this is invalid SQL, and in most cases it simply wouldn't work because of missing columns, + // but in this case we don't care: we just want to check catalog/schema substitution. + private static final String CUSTOM_INSERT_SQL_PART_1 = "insert into {h-catalog}{h-schema}"; + private static final String CUSTOM_INSERT_SQL_PART_2 = ", {h-domain}"; + private static final String CUSTOM_INSERT_SQL_PART_3 = " VALUES(basic = ?)"; + private static final String CUSTOM_UPDATE_SQL_PART_1 = "update {h-catalog}{h-schema}"; + private static final String CUSTOM_UPDATE_SQL_PART_2 = ", {h-domain}"; + private static final String CUSTOM_UPDATE_SQL_PART_3 = " SET basic = ?"; + private static final String CUSTOM_DELETE_SQL_PART_1 = "delete from {h-catalog}{h-schema}"; + private static final String CUSTOM_DELETE_SQL_PART_2 = ", {h-domain}"; + private static final String CUSTOM_DELETE_SQL_PART_3 = " WHERE id = ?"; + + @Parameterized.Parameters(name = "configuredXmlMappingPath = {0}, configuredDefaultCatalog = {1}, configuredDefaultSchema = {2}") + public static List params() { + List params = new ArrayList<>(); + for ( String defaultCatalog : Arrays.asList( null, "someDefaultCatalog" ) ) { + for ( String defaultSchema : Arrays.asList( null, "someDefaultSchema" ) ) { + params.add( new Object[] { null, defaultCatalog, defaultSchema, + // The default catalog/schema should be used when + // there is no implicit catalog/schema defined in the mapping. + defaultCatalog, defaultSchema } ); + } + } + params.add( new Object[] { "implicit-global-catalog-and-schema.orm.xml", + null, null, + "someImplicitCatalog", "someImplicitSchema" } ); + // HHH-14922: Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" +// params.add( new Object[] { "implicit-global-catalog-and-schema.orm.xml", +// "someDefaultCatalog", "someDefaultSchema", +// // The implicit catalog/schema defined in the mapping should take precedence +// // over the default catalog/schema defined in settings. +// "someImplicitCatalog", "someImplicitSchema" } ); + return params; + } + + @Parameterized.Parameter + public String configuredXmlMappingPath; + @Parameterized.Parameter(1) + public String configuredDefaultCatalog; + @Parameterized.Parameter(2) + public String configuredDefaultSchema; + @Parameterized.Parameter(3) + public String expectedDefaultCatalog; + @Parameterized.Parameter(4) + public String expectedDefaultSchema; + + private boolean dbSupportsCatalogs; + private boolean dbSupportsSchemas; + + private MetadataImplementor metadata; + private final List toClose = new ArrayList<>(); + private SessionFactoryImplementor sessionFactory; + + @BeforeClassOnce + public void initSessionFactory() { + List> annotatedClasses = Arrays.asList( + EntityWithDefaultQualifiers.class, + EntityWithExplicitQualifiers.class, + EntityWithJoinedInheritanceWithDefaultQualifiers.class, + EntityWithJoinedInheritanceWithDefaultQualifiersSubclass.class, + EntityWithJoinedInheritanceWithExplicitQualifiers.class, + EntityWithJoinedInheritanceWithExplicitQualifiersSubclass.class, + EntityWithTablePerClassInheritanceWithDefaultQualifiers.class, + EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass.class, + EntityWithTablePerClassInheritanceWithExplicitQualifiers.class, + EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass.class, + EntityWithDefaultQualifiersWithCustomSql.class, + EntityWithDefaultQualifiersWithIdentityGenerator.class, + EntityWithExplicitQualifiersWithIdentityGenerator.class, + EntityWithDefaultQualifiersWithTableGenerator.class, + EntityWithExplicitQualifiersWithTableGenerator.class, + EntityWithDefaultQualifiersWithSequenceGenerator.class, + EntityWithExplicitQualifiersWithSequenceGenerator.class, + EntityWithDefaultQualifiersWithSeqHiLoGenerator.class, + EntityWithExplicitQualifiersWithSeqHiLoGenerator.class, + EntityWithDefaultQualifiersWithIncrementGenerator.class, + EntityWithExplicitQualifiersWithIncrementGenerator.class, + EntityWithDefaultQualifiersWithSequenceIdentityGenerator.class, + EntityWithExplicitQualifiersWithSequenceIdentityGenerator.class, + EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.class, + EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.class, + EntityWithDefaultQualifiersWithLegacySequenceGenerator.class, + EntityWithExplicitQualifiersWithLegacySequenceGenerator.class + ); + + StandardServiceRegistry serviceRegistry = createStandardServiceRegistry( configuredDefaultCatalog, configuredDefaultSchema ); + + final MetadataSources metadataSources = new MetadataSources( serviceRegistry ); + metadataSources.addInputStream( getClass().getResourceAsStream( "implicit-file-level-catalog-and-schema.orm.xml" ) ); + metadataSources.addInputStream( getClass().getResourceAsStream( "implicit-file-level-catalog-and-schema.hbm.xml" ) ); + if ( configuredXmlMappingPath != null ) { + metadataSources.addInputStream( getClass().getResourceAsStream( configuredXmlMappingPath ) ); + } + for ( Class annotatedClass : annotatedClasses ) { + metadataSources.addAnnotatedClass( annotatedClass ); + } + + final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder(); + metadata = (MetadataImplementor) metadataBuilder.build(); + + SessionFactoryBuilder sfb = metadata.getSessionFactoryBuilder(); + + sessionFactory = (SessionFactoryImplementor) sfb.build(); + toClose.add( sessionFactory ); + + NameQualifierSupport nameQualifierSupport = sessionFactory.getJdbcServices().getJdbcEnvironment() + .getNameQualifierSupport(); + dbSupportsCatalogs = nameQualifierSupport.supportsCatalogs(); + dbSupportsSchemas = nameQualifierSupport.supportsSchemas(); + } + + @AfterClassOnce + public void cleanup() throws Throwable { + Throwable thrown = null; + Collections.reverse( toClose ); + for ( AutoCloseable closeable : toClose ) { + try { + closeable.close(); + } + catch (Throwable t) { + if ( thrown == null ) { + thrown = t; + } + else { + thrown.addSuppressed( t ); + } + } + } + if ( thrown != null ) { + throw thrown; + } + } + + private StandardServiceRegistry createStandardServiceRegistry(String defaultCatalog, String defaultSchema) { + final BootstrapServiceRegistryBuilder bsrb = new BootstrapServiceRegistryBuilder(); + bsrb.applyClassLoader( getClass().getClassLoader() ); + // by default we do not share the BootstrapServiceRegistry nor the StandardServiceRegistry, + // so we want the BootstrapServiceRegistry to be automatically closed when the + // StandardServiceRegistry is closed. + bsrb.enableAutoClose(); + + final BootstrapServiceRegistry bsr = bsrb.build(); + + final Map settings = new HashMap<>(); + settings.put( GlobalTemporaryTableBulkIdStrategy.DROP_ID_TABLES, "true" ); + settings.put( LocalTemporaryTableBulkIdStrategy.DROP_ID_TABLES, "true" ); + if ( !Environment.getProperties().containsKey( Environment.CONNECTION_PROVIDER ) ) { + settings.put( + AvailableSettings.CONNECTION_PROVIDER, + SharedDriverManagerConnectionProviderImpl.getInstance() + ); + } + if ( defaultCatalog != null ) { + settings.put( AvailableSettings.DEFAULT_CATALOG, defaultCatalog ); + } + if ( defaultSchema != null ) { + settings.put( AvailableSettings.DEFAULT_SCHEMA, defaultSchema ); + } + + final StandardServiceRegistryBuilder ssrb = new StandardServiceRegistryBuilder( bsr ); + ssrb.applySettings( settings ); + StandardServiceRegistry registry = ssrb.build(); + toClose.add( registry ); + return registry; + } + + @Test + public void createSchema_fromSessionFactory() { + String script = generateScriptFromSessionFactory( "create" ); + verifyDDLQualifiers( script ); + } + + @Test + public void dropSchema_fromSessionFactory() { + String script = generateScriptFromSessionFactory( "drop" ); + verifyDDLQualifiers( script ); + } + + @Test + public void createSchema_fromMetadata() { + String script = generateScriptFromMetadata( SchemaExport.Action.CREATE ); + verifyDDLQualifiers( script ); + } + + @Test + public void dropSchema_fromMetadata() { + String script = generateScriptFromMetadata( SchemaExport.Action.DROP ); + verifyDDLQualifiers( script ); + } + + @Test + public void entityPersister() { + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiers.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiers.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithOrmXmlImplicitFileLevelQualifiers.class, expectedImplicitFileLevelQualifier() ); + verifyEntityPersisterQualifiers( EntityWithHbmXmlImplicitFileLevelQualifiers.class, expectedImplicitFileLevelQualifier() ); + + verifyEntityPersisterQualifiers( EntityWithJoinedInheritanceWithDefaultQualifiers.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithJoinedInheritanceWithDefaultQualifiersSubclass.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithJoinedInheritanceWithExplicitQualifiers.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithJoinedInheritanceWithExplicitQualifiersSubclass.class, expectedExplicitQualifier() ); + + verifyEntityPersisterQualifiers( EntityWithTablePerClassInheritanceWithDefaultQualifiers.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithTablePerClassInheritanceWithExplicitQualifiers.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass.class, expectedExplicitQualifier() ); + + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithCustomSql.class, expectedDefaultQualifier() ); + + + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithIdentityGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithIdentityGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithTableGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithTableGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithSequenceGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithSequenceGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithSeqHiLoGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithSeqHiLoGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithIncrementGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithIncrementGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithSequenceIdentityGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithSequenceIdentityGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.class, expectedExplicitQualifier() ); + verifyEntityPersisterQualifiers( EntityWithDefaultQualifiersWithLegacySequenceGenerator.class, expectedDefaultQualifier() ); + verifyEntityPersisterQualifiers( EntityWithExplicitQualifiersWithLegacySequenceGenerator.class, expectedExplicitQualifier() ); + } + + private void verifyEntityPersisterQualifiers(Class entityClass, ExpectedQualifier expectedQualifier) { + // The hbm.xml mapping unfortunately sets the native entity name on top of the JPA entity name, + // so many methods that allow retrieving the entity persister or entity metamodel from the entity class no longer work, + // because these methods generally assume the native entity name is the FQCN. + // Thus we use custom code. + AbstractEntityPersister persister = (AbstractEntityPersister) sessionFactory.getMetamodel().entityPersisters() + .values().stream() + .filter( p -> p.getMappedClass().equals( entityClass ) ) + .findFirst() + .orElseThrow( () -> new IllegalStateException( "Cannot find persister for " + entityClass ) ); + String jpaEntityName = sessionFactory.getMetamodel().getEntities().stream() + .filter( p -> p.getBindableJavaType().equals( entityClass ) ) + .findFirst() + .orElseThrow( () -> new IllegalStateException( "Cannot find entity metamodel for " + entityClass ) ) + .getName(); + + // Table names are what's used for Query, in particular. + verifyOnlyQualifier( persister.getTableName(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + // Here, to simplify assertions, we assume all derived entity types have: + // - an entity name prefixed with the name of their super entity type + // - the same explicit catalog and schema, if any, as their super entity type + verifyOnlyQualifier( persister.getTableNames(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + + // This will include SQL generated by ID generators in some cases, which will be validated here + // because ID generators table/sequence names are prefixed with the owning entity name. + verifyOnlyQualifier( persister.getSQLInsertStrings(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + if ( persister.isIdentifierAssignedByInsert() ) { + verifyOnlyQualifier( persister.getSQLIdentityInsertString(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + } + try { + verifyOnlyQualifierOptional( persister.getIdentitySelectString(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + } + catch (MappingException e) { + if ( e.getMessage().contains( "does not support identity key generation" ) ) { + // For some reason Oracle12cIdentityColumnSupport#supportsInsertSelectIdentity() returns true, + // but getIdentitySelectString is not implemented, resulting in runtime exceptions. + // Whatever, we'll just ignore this for now. + } + else { + throw e; + } + } + + verifyOnlyQualifier( persister.getSQLUpdateStrings(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + verifyOnlyQualifier( persister.getSQLLazyUpdateStrings(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + + verifyOnlyQualifier( persister.getSQLDeleteStrings(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + + verifyOnlyQualifier( persister.getSQLSnapshotSelectString(), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + + // This is used in the "select" id generator in particular. + verifyOnlyQualifierOptional( persister.getSelectByUniqueKeyString( "basic" ), SqlType.RUNTIME, + jpaEntityName, expectedQualifier ); + } + + @Test + public void tableGenerator() { + org.hibernate.id.enhanced.TableGenerator generator = idGenerator( + org.hibernate.id.enhanced.TableGenerator.class, + EntityWithDefaultQualifiersWithTableGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithTableGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.enhanced.TableGenerator.class, + EntityWithExplicitQualifiersWithTableGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithTableGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void enhancedTableGenerator() { + org.hibernate.id.enhanced.TableGenerator generator = idGenerator( + org.hibernate.id.enhanced.TableGenerator.class, + EntityWithDefaultQualifiersWithTableGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithTableGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.enhanced.TableGenerator.class, + EntityWithExplicitQualifiersWithTableGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithTableGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void sequenceGenerator() { + org.hibernate.id.enhanced.SequenceStyleGenerator generator = idGenerator( + org.hibernate.id.enhanced.SequenceStyleGenerator.class, + EntityWithDefaultQualifiersWithSequenceGenerator.class ); + verifyOnlyQualifier( generator.getDatabaseStructure().getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithSequenceGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.enhanced.SequenceStyleGenerator.class, + EntityWithExplicitQualifiersWithSequenceGenerator.class ); + verifyOnlyQualifier( generator.getDatabaseStructure().getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithSequenceGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void enhancedSequenceGenerator() { + org.hibernate.id.enhanced.SequenceStyleGenerator generator = idGenerator( + org.hibernate.id.enhanced.SequenceStyleGenerator.class, + EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.class ); + verifyOnlyQualifier( generator.getDatabaseStructure().getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.enhanced.SequenceStyleGenerator.class, + EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.class ); + verifyOnlyQualifier( generator.getDatabaseStructure().getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void legacySequenceGenerator() { + org.hibernate.id.SequenceGenerator generator = idGenerator( org.hibernate.id.SequenceGenerator.class, + EntityWithDefaultQualifiersWithLegacySequenceGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithLegacySequenceGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.SequenceGenerator.class, + EntityWithExplicitQualifiersWithLegacySequenceGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithLegacySequenceGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void seqHiLoGenerator() { + org.hibernate.id.SequenceHiLoGenerator generator = idGenerator( org.hibernate.id.SequenceHiLoGenerator.class, + EntityWithDefaultQualifiersWithSeqHiLoGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithSeqHiLoGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.SequenceHiLoGenerator.class, + EntityWithExplicitQualifiersWithSeqHiLoGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithSeqHiLoGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void incrementGenerator() { + org.hibernate.id.IncrementGenerator generator = idGenerator( org.hibernate.id.IncrementGenerator.class, + EntityWithDefaultQualifiersWithIncrementGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithIncrementGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.IncrementGenerator.class, + EntityWithExplicitQualifiersWithIncrementGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithIncrementGenerator.NAME, expectedExplicitQualifier() ); + } + + @Test + public void sequenceIdentityGenerator() { + org.hibernate.id.SequenceIdentityGenerator generator = idGenerator( org.hibernate.id.SequenceIdentityGenerator.class, + EntityWithDefaultQualifiersWithSequenceIdentityGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithDefaultQualifiersWithSequenceIdentityGenerator.NAME, expectedDefaultQualifier() ); + + generator = idGenerator( org.hibernate.id.SequenceIdentityGenerator.class, + EntityWithExplicitQualifiersWithSequenceIdentityGenerator.class ); + verifyOnlyQualifier( generator.getAllSqlForTests(), SqlType.RUNTIME, + EntityWithExplicitQualifiersWithSequenceIdentityGenerator.NAME, expectedExplicitQualifier() ); + } + + private T idGenerator(Class expectedType, Class entityClass) { + AbstractEntityPersister persister = (AbstractEntityPersister) + sessionFactory.getMetamodel().entityPersister( entityClass ); + return expectedType.cast( persister.getIdentifierGenerator() ); + } + + private void verifyDDLQualifiers(String sql) { + // Here, to simplify assertions, we assume: + // - that all entity types have a table name identical to the entity name + // - that all association tables have a name prefixed with the name of their owning entity type + // - that all association tables have the same explicit catalog and schema, if any, as their owning entity type + // - that all ID generator tables/sequences have a name prefixed with the name of their owning entity type + + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiers.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiers.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithOrmXmlImplicitFileLevelQualifiers.NAME, expectedImplicitFileLevelQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithHbmXmlImplicitFileLevelQualifiers.NAME, expectedImplicitFileLevelQualifier() ); + + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithJoinedInheritanceWithDefaultQualifiers.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithJoinedInheritanceWithDefaultQualifiersSubclass.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithJoinedInheritanceWithExplicitQualifiers.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithJoinedInheritanceWithExplicitQualifiersSubclass.NAME, expectedExplicitQualifier() ); + + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithTablePerClassInheritanceWithDefaultQualifiers.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithTablePerClassInheritanceWithExplicitQualifiers.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass.NAME, expectedExplicitQualifier() ); + + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithCustomSql.NAME, expectedDefaultQualifier() ); + + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithIdentityGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithIdentityGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithTableGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithTableGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithSequenceGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithSequenceGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithSeqHiLoGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithSeqHiLoGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithIncrementGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithIncrementGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithSequenceIdentityGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithSequenceIdentityGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.NAME, expectedExplicitQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithDefaultQualifiersWithLegacySequenceGenerator.NAME, expectedDefaultQualifier() ); + verifyOnlyQualifier( sql, SqlType.DDL, EntityWithExplicitQualifiersWithLegacySequenceGenerator.NAME, expectedExplicitQualifier() ); + } + + private enum SqlType { + DDL, + RUNTIME + } + + private void verifyOnlyQualifier(String[] sql, SqlType sqlType, String name, ExpectedQualifier expectedQualifier) { + verifyOnlyQualifier( String.join( "\n", sql ), sqlType, name, expectedQualifier ); + } + + private void verifyOnlyQualifierOptional(String sql, SqlType sqlType, String name, ExpectedQualifier expectedQualifier) { + verifyOnlyQualifier( sql, sqlType, name, expectedQualifier, true ); + } + + private void verifyOnlyQualifier(String sql, SqlType sqlType, String name, ExpectedQualifier expectedQualifier) { + verifyOnlyQualifier( sql, sqlType, name, expectedQualifier, false ); + } + + private void verifyOnlyQualifier(String sql, SqlType sqlType, String name, ExpectedQualifier expectedQualifier, boolean optional) { + String patternStringForTableName = SQL_QUOTE_CHARACTER_CLASS + "?" + Pattern.quote( name ) + "(?!\\w*_seq)" + SQL_QUOTE_CHARACTER_CLASS + "?"; + String patternStringForSequenceName = SQL_QUOTE_CHARACTER_CLASS + "?" + Pattern.quote( name ) + "\\w*_seq" + SQL_QUOTE_CHARACTER_CLASS + "?"; + + ExpectedQualifier expectedQualifierForTables = expectedQualifier; + ExpectedQualifier expectedQualifierForSequences; + if ( SqlType.DDL == sqlType && sessionFactory.getJdbcServices().getDialect() instanceof SQLServer2012Dialect ) { + // SQL Server does not allow the catalog in the sequence name when creating the sequence, + // so we need different patterns for sequence names and table names. + // See org.hibernate.dialect.SQLServer2012Dialect.SqlServerSequenceExporter.getFormattedSequenceName + expectedQualifierForSequences = new ExpectedQualifier( null, expectedQualifier.schema ); + } + else { + expectedQualifierForSequences = expectedQualifier; + } + + if ( !optional ) { + // Check that we find the name at least once with the proper qualifier, be it a table or a sequence. + // While not strictly necessary, this ensures our patterns are not completely wrong. + assertThat( sql ) + .containsPattern( + "(" + expectedQualifierForTables.patternStringForNameWithThisQualifier( patternStringForTableName ) + + ")|(" + + expectedQualifierForSequences.patternStringForNameWithThisQualifier( patternStringForSequenceName ) + + ")" ); + } + + // Check that we don't find any name with an incorrect qualifier + assertThat( sql.split( System.getProperty( "line.separator" ) ) ) + .allSatisfy( line -> assertThat( line ) + .doesNotContainPattern( expectedQualifierForTables + .patternStringForNameWithDifferentQualifier( patternStringForTableName ) ) + .doesNotContainPattern( expectedQualifierForSequences + .patternStringForNameWithDifferentQualifier( patternStringForSequenceName ) ) ); + } + + private ExpectedQualifier expectedDefaultQualifier() { + return expectedQualifier( expectedDefaultCatalog, expectedDefaultSchema ); + } + + private ExpectedQualifier expectedExplicitQualifier() { + return expectedQualifier( EXPLICIT_CATALOG, EXPLICIT_SCHEMA ); + } + + private ExpectedQualifier expectedImplicitFileLevelQualifier() { + return expectedQualifier( "someImplicitFileLevelCatalog", "someImplicitFileLevelSchema" ); + } + + private ExpectedQualifier expectedQualifier(String catalog, String schema) { + return new ExpectedQualifier( + dbSupportsCatalogs ? catalog : null, + dbSupportsSchemas ? schema : null + ); + } + + @SuppressWarnings({ "unchecked", "rawtypes" }) + private String generateScriptFromSessionFactory(String action) { + ServiceRegistryImplementor serviceRegistry = sessionFactory.getServiceRegistry(); + Map settings = new HashMap<>( + serviceRegistry.getService( ConfigurationService.class ).getSettings() + ); + StringWriter writer = new StringWriter(); + settings.put( AvailableSettings.HBM2DDL_SCRIPTS_ACTION, action ); + settings.put( AvailableSettings.HBM2DDL_SCRIPTS_CREATE_TARGET, writer ); + settings.put( AvailableSettings.HBM2DDL_SCRIPTS_DROP_TARGET, writer ); + + SchemaManagementToolCoordinator.process( + metadata, serviceRegistry, settings, DelayedDropRegistryNotAvailableImpl.INSTANCE ); + return writer.toString(); + } + + // This is precisely how scripts are generated for the Quarkus DevUI + // Don't change this code except to match changes in + // https://github.com/quarkusio/quarkus/blob/d07ecb23bfba38ee48868635e155c4b513ce6af9/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/devconsole/HibernateOrmDevConsoleInfoSupplier.java#L61-L92 + private String generateScriptFromMetadata(SchemaExport.Action action) { + ServiceRegistryImplementor sessionFactoryServiceRegistry = sessionFactory.getServiceRegistry(); + SchemaExport schemaExport = new SchemaExport(); + schemaExport.setFormat( true ); + schemaExport.setDelimiter( ";" ); + StringWriter writer = new StringWriter(); + schemaExport.doExecution( action, false, metadata, sessionFactoryServiceRegistry, + new TargetDescriptor() { + @Override + public EnumSet getTargetTypes() { + return EnumSet.of( TargetType.SCRIPT ); + } + + @Override + public ScriptTargetOutput getScriptTargetOutput() { + return new ScriptTargetOutputToWriter( writer ) { + @Override + public void accept(String command) { + super.accept( command ); + } + }; + } + } + ); + return writer.toString(); + } + + private static class ExpectedQualifier { + private final String catalog; + private final String schema; + + private ExpectedQualifier(String catalog, String schema) { + this.catalog = catalog; + this.schema = schema; + } + + String patternStringForNameWithThisQualifier(String patternStringForName) { + if ( catalog == null && schema == null ) { + // Look for unqualified names + return "(? oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + @Entity(name = EntityWithExplicitQualifiers.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiers { + public static final String NAME = "EntityWithExplicitQualifiers"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + public static class EntityWithOrmXmlImplicitFileLevelQualifiers { + public static final String NAME = "EntityWithOrmXmlImplicitFileLevelQualifiers"; + private Long id; + private String basic; + private List oneToMany; + private List manyToMany; + private List elementCollection; + } + + public static class EntityWithHbmXmlImplicitFileLevelQualifiers { + public static final String NAME = "EntityWithHbmXmlImplicitFileLevelQualifiers"; + private Long id; + private String basic; + } + + @Entity(name = EntityWithJoinedInheritanceWithDefaultQualifiers.NAME) + @Inheritance(strategy = InheritanceType.JOINED) + public static class EntityWithJoinedInheritanceWithDefaultQualifiers { + public static final String NAME = "EntityWithJoinedInheritanceWithDefaultQualifiers"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + @Entity(name = EntityWithJoinedInheritanceWithDefaultQualifiersSubclass.NAME) + public static class EntityWithJoinedInheritanceWithDefaultQualifiersSubclass + extends EntityWithJoinedInheritanceWithDefaultQualifiers { + public static final String NAME = "EntityWithJoinedInheritanceWithDefaultQualifiersSubclass"; + @Basic + private String basic2; + } + + @Entity(name = EntityWithJoinedInheritanceWithExplicitQualifiers.NAME) + @Inheritance(strategy = InheritanceType.JOINED) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithJoinedInheritanceWithExplicitQualifiers { + public static final String NAME = "EntityWithJoinedInheritanceWithExplicitQualifiers"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + @Entity(name = EntityWithJoinedInheritanceWithExplicitQualifiersSubclass.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithJoinedInheritanceWithExplicitQualifiersSubclass + extends EntityWithJoinedInheritanceWithExplicitQualifiers { + public static final String NAME = "EntityWithJoinedInheritanceWithExplicitQualifiersSubclass"; + @Basic + private String basic2; + } + + @Entity(name = EntityWithTablePerClassInheritanceWithDefaultQualifiers.NAME) + @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) + public static class EntityWithTablePerClassInheritanceWithDefaultQualifiers { + public static final String NAME = "EntityWithTablePerClassInheritanceWithDefaultQualifiers"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + @Entity(name = EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass.NAME) + public static class EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass + extends EntityWithTablePerClassInheritanceWithDefaultQualifiers { + public static final String NAME = "EntityWithTablePerClassInheritanceWithDefaultQualifiersSubclass"; + @Basic + private String basic2; + } + + @Entity(name = EntityWithTablePerClassInheritanceWithExplicitQualifiers.NAME) + @Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithTablePerClassInheritanceWithExplicitQualifiers { + public static final String NAME = "EntityWithTablePerClassInheritanceWithExplicitQualifiers"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA, + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + private List elementCollection; + } + + @Entity(name = EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass + extends EntityWithTablePerClassInheritanceWithExplicitQualifiers { + public static final String NAME = "EntityWithTablePerClassInheritanceWithExplicitQualifiersSubclass"; + @Basic + private String basic2; + } + + @Entity(name = EntityWithDefaultQualifiersWithCustomSql.NAME) + @SQLInsert(sql = CUSTOM_INSERT_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_INSERT_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_INSERT_SQL_PART_3) + @SQLUpdate(sql = CUSTOM_UPDATE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_UPDATE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_UPDATE_SQL_PART_3) + @SQLDelete(sql = CUSTOM_DELETE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_DELETE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + CUSTOM_DELETE_SQL_PART_3) + public static class EntityWithDefaultQualifiersWithCustomSql { + public static final String NAME = "EntityWithDefaultQualifiersWithCustomSql"; + @Id + private Long id; + @Basic + private String basic; + @OneToMany + @JoinTable(name = NAME + "_oneToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_oneToMany")) + @SQLInsert(sql = CUSTOM_INSERT_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_INSERT_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_INSERT_SQL_PART_3) + @SQLUpdate(sql = CUSTOM_UPDATE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_UPDATE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_UPDATE_SQL_PART_3) + @SQLDelete(sql = CUSTOM_DELETE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_DELETE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_oneToMany" + CUSTOM_DELETE_SQL_PART_3) + private List oneToMany; + @OneToMany + @JoinTable(name = NAME + "_manyToMany", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + inverseJoinColumns = @JoinColumn(name = "inverse"), + foreignKey = @ForeignKey(name = "FK_manyToMany")) + @SQLInsert(sql = CUSTOM_INSERT_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_INSERT_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_INSERT_SQL_PART_3) + @SQLUpdate(sql = CUSTOM_UPDATE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_UPDATE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_UPDATE_SQL_PART_3) + @SQLDelete(sql = CUSTOM_DELETE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_DELETE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_manyToMany" + CUSTOM_DELETE_SQL_PART_3) + private List manyToMany; + @ElementCollection + @JoinTable(name = NAME + "_elementCollection", + // Custom names to avoid false positive in assertions + joinColumns = @JoinColumn(name = "forward"), + foreignKey = @ForeignKey(name = "FK_elementCollection")) + @SQLInsert(sql = CUSTOM_INSERT_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_INSERT_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_INSERT_SQL_PART_3) + @SQLUpdate(sql = CUSTOM_UPDATE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_UPDATE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_UPDATE_SQL_PART_3) + @SQLDelete(sql = CUSTOM_DELETE_SQL_PART_1 + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_DELETE_SQL_PART_2 + + EntityWithDefaultQualifiersWithCustomSql.NAME + "_elementCollection" + CUSTOM_DELETE_SQL_PART_3) + private List elementCollection; + } + + @Entity(name = EntityWithDefaultQualifiersWithIdentityGenerator.NAME) + public static class EntityWithDefaultQualifiersWithIdentityGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithIdentityGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithIdentityGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithIdentityGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithIdentityGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithDefaultQualifiersWithSequenceGenerator.NAME) + public static class EntityWithDefaultQualifiersWithSequenceGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithSequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @SequenceGenerator(name = NAME + "_generator", sequenceName = NAME + "_seq") + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithSequenceGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithSequenceGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithSequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @SequenceGenerator(name = NAME + "_generator", sequenceName = NAME + "_seq", + catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + private Long id; + @Basic + private String basic; + } + + + @Entity(name = EntityWithDefaultQualifiersWithTableGenerator.NAME) + public static class EntityWithDefaultQualifiersWithTableGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithTableGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @TableGenerator(name = NAME + "_generator", table = NAME + "_tableseq") + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithTableGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithTableGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithTableGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @TableGenerator(name = NAME + "_generator", table = NAME + "_tableseq", + catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithDefaultQualifiersWithSeqHiLoGenerator.NAME) + public static class EntityWithDefaultQualifiersWithSeqHiLoGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithSeqHiLoGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "org.hibernate.id.SequenceHiLoGenerator", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq"), + @Parameter(name = "max_lo", value = "5") + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithSeqHiLoGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithSeqHiLoGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithSeqHiLoGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "org.hibernate.id.SequenceHiLoGenerator", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq"), + @Parameter(name = "max_lo", value = "5"), + @Parameter(name = "catalog", value = EXPLICIT_CATALOG), + @Parameter(name = "schema", value = EXPLICIT_SCHEMA) + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithDefaultQualifiersWithIncrementGenerator.NAME) + public static class EntityWithDefaultQualifiersWithIncrementGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithIncrementGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "increment") + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithIncrementGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithIncrementGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithIncrementGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "increment", parameters = { + @Parameter(name = "catalog", value = EXPLICIT_CATALOG), + @Parameter(name = "schema", value = EXPLICIT_SCHEMA) + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithDefaultQualifiersWithSequenceIdentityGenerator.NAME) + public static class EntityWithDefaultQualifiersWithSequenceIdentityGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithSequenceIdentityGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "sequence-identity", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq") + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithSequenceIdentityGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithSequenceIdentityGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithSequenceIdentityGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "sequence-identity", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq"), + @Parameter(name = "catalog", value = EXPLICIT_CATALOG), + @Parameter(name = "schema", value = EXPLICIT_SCHEMA) + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithDefaultQualifiersWithEnhancedSequenceGenerator.NAME) + public static class EntityWithDefaultQualifiersWithEnhancedSequenceGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithEnhancedSequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "enhanced-sequence", parameters = { + @Parameter(name = "sequence_name", value = NAME + "_seq") + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithEnhancedSequenceGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithEnhancedSequenceGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithEnhancedSequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "enhanced-sequence", parameters = { + @Parameter(name = "sequence_name", value = NAME + "_seq"), + @Parameter(name = "catalog", value = EXPLICIT_CATALOG), + @Parameter(name = "schema", value = EXPLICIT_SCHEMA) + }) + private Long id; + @Basic + private String basic; + } + + + @Entity(name = EntityWithDefaultQualifiersWithLegacySequenceGenerator.NAME) + public static class EntityWithDefaultQualifiersWithLegacySequenceGenerator { + public static final String NAME = "EntityWithDefaultQualifiersWithLegacySequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "org.hibernate.id.SequenceGenerator", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq") + }) + private Long id; + @Basic + private String basic; + } + + @Entity(name = EntityWithExplicitQualifiersWithLegacySequenceGenerator.NAME) + @Table(catalog = EXPLICIT_CATALOG, schema = EXPLICIT_SCHEMA) + public static class EntityWithExplicitQualifiersWithLegacySequenceGenerator { + public static final String NAME = "EntityWithExplicitQualifiersWithLegacySequenceGenerator"; + @Id + @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = NAME + "_generator") + @GenericGenerator(name = NAME + "_generator", strategy = "org.hibernate.id.SequenceGenerator", parameters = { + @Parameter(name = "sequence", value = NAME + "_seq"), + @Parameter(name = "catalog", value = EXPLICIT_CATALOG), + @Parameter(name = "schema", value = EXPLICIT_SCHEMA) + }) + private Long id; + @Basic + private String basic; + } + +} diff --git a/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.hbm.xml b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.hbm.xml new file mode 100644 index 000000000000..fc5317d20da2 --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.hbm.xml @@ -0,0 +1,17 @@ + + + + + + + + diff --git a/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.orm.xml b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.orm.xml new file mode 100644 index 000000000000..cff6d97f8bc7 --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-file-level-catalog-and-schema.orm.xml @@ -0,0 +1,46 @@ + + + + org.hibernate.test.boot.database.qualfiedTableNaming + someImplicitFileLevelSchema + someImplicitFileLevelCatalog + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-global-catalog-and-schema.orm.xml b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-global-catalog-and-schema.orm.xml new file mode 100644 index 000000000000..a8c02b858be8 --- /dev/null +++ b/hibernate-core/src/test/resources/org/hibernate/test/boot/database/qualfiedTableNaming/implicit-global-catalog-and-schema.orm.xml @@ -0,0 +1,19 @@ + + + + + + someImplicitSchema + someImplicitCatalog + + + From 3071f58c217d8933766b75270879a6dba7f1f166 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Fri, 5 Nov 2021 18:25:23 +0100 Subject: [PATCH 013/256] HHH-14921 Test handling of default catalog and schema when not configured during metadata creation --- .../DefaultCatalogAndSchemaTest.java | 84 ++++++++++++++----- 1 file changed, 62 insertions(+), 22 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java index dd78d99cf77c..f249d0bd5468 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java @@ -42,6 +42,9 @@ import org.hibernate.boot.MetadataBuilder; import org.hibernate.boot.MetadataSources; import org.hibernate.boot.SessionFactoryBuilder; +import org.hibernate.boot.internal.MetadataImpl; +import org.hibernate.boot.internal.SessionFactoryBuilderImpl; +import org.hibernate.boot.internal.SessionFactoryOptionsBuilder; import org.hibernate.boot.registry.BootstrapServiceRegistry; import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; import org.hibernate.boot.registry.StandardServiceRegistry; @@ -97,38 +100,53 @@ public class DefaultCatalogAndSchemaTest { private static final String CUSTOM_DELETE_SQL_PART_2 = ", {h-domain}"; private static final String CUSTOM_DELETE_SQL_PART_3 = " WHERE id = ?"; - @Parameterized.Parameters(name = "configuredXmlMappingPath = {0}, configuredDefaultCatalog = {1}, configuredDefaultSchema = {2}") + enum SettingsMode { + // "Standard" way of providing settings, though configuration properties: + // both metadata and session factory receive the same settings + METADATA_SERVICE_REGISTRY, + // An alternative way of providing settings so that they are applied late, + // when the session factory is created. + // This mode is used by frameworks relying on build-time initialization of the application, + // like Quarkus and its "static init". + SESSION_FACTORY_SERVICE_REGISTRY + } + + @Parameterized.Parameters(name = "settingsMode = {0}, configuredXmlMappingPath = {1}, configuredDefaultCatalog = {2}, configuredDefaultSchema = {3}") public static List params() { List params = new ArrayList<>(); - for ( String defaultCatalog : Arrays.asList( null, "someDefaultCatalog" ) ) { - for ( String defaultSchema : Arrays.asList( null, "someDefaultSchema" ) ) { - params.add( new Object[] { null, defaultCatalog, defaultSchema, - // The default catalog/schema should be used when - // there is no implicit catalog/schema defined in the mapping. - defaultCatalog, defaultSchema } ); + for ( SettingsMode mode : SettingsMode.values() ) { + for ( String defaultCatalog : Arrays.asList( null, "someDefaultCatalog" ) ) { + for ( String defaultSchema : Arrays.asList( null, "someDefaultSchema" ) ) { + params.add( new Object[] { mode, null, defaultCatalog, defaultSchema, + // The default catalog/schema should be used when + // there is no implicit catalog/schema defined in the mapping. + defaultCatalog, defaultSchema } ); + } } + params.add( new Object[] { mode, "implicit-global-catalog-and-schema.orm.xml", + null, null, + "someImplicitCatalog", "someImplicitSchema" } ); + // HHH-14922: Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" +// params.add( new Object[] { mode, "implicit-global-catalog-and-schema.orm.xml", +// "someDefaultCatalog", "someDefaultSchema", +// // The implicit catalog/schema defined in the mapping should take precedence +// // over the default catalog/schema defined in settings. +// "someImplicitCatalog", "someImplicitSchema" } ); } - params.add( new Object[] { "implicit-global-catalog-and-schema.orm.xml", - null, null, - "someImplicitCatalog", "someImplicitSchema" } ); - // HHH-14922: Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" -// params.add( new Object[] { "implicit-global-catalog-and-schema.orm.xml", -// "someDefaultCatalog", "someDefaultSchema", -// // The implicit catalog/schema defined in the mapping should take precedence -// // over the default catalog/schema defined in settings. -// "someImplicitCatalog", "someImplicitSchema" } ); return params; } @Parameterized.Parameter - public String configuredXmlMappingPath; + public SettingsMode settingsMode; @Parameterized.Parameter(1) - public String configuredDefaultCatalog; + public String configuredXmlMappingPath; @Parameterized.Parameter(2) - public String configuredDefaultSchema; + public String configuredDefaultCatalog; @Parameterized.Parameter(3) - public String expectedDefaultCatalog; + public String configuredDefaultSchema; @Parameterized.Parameter(4) + public String expectedDefaultCatalog; + @Parameterized.Parameter(5) public String expectedDefaultSchema; private boolean dbSupportsCatalogs; @@ -170,7 +188,17 @@ public void initSessionFactory() { EntityWithExplicitQualifiersWithLegacySequenceGenerator.class ); - StandardServiceRegistry serviceRegistry = createStandardServiceRegistry( configuredDefaultCatalog, configuredDefaultSchema ); + StandardServiceRegistry serviceRegistry; + switch ( settingsMode ) { + case METADATA_SERVICE_REGISTRY: + serviceRegistry = createStandardServiceRegistry( configuredDefaultCatalog, configuredDefaultSchema ); + break; + case SESSION_FACTORY_SERVICE_REGISTRY: + serviceRegistry = createStandardServiceRegistry( null, null ); + break; + default: + throw new IllegalStateException( "Unknown settings mode: " + settingsMode ); + } final MetadataSources metadataSources = new MetadataSources( serviceRegistry ); metadataSources.addInputStream( getClass().getResourceAsStream( "implicit-file-level-catalog-and-schema.orm.xml" ) ); @@ -185,7 +213,19 @@ public void initSessionFactory() { final MetadataBuilder metadataBuilder = metadataSources.getMetadataBuilder(); metadata = (MetadataImplementor) metadataBuilder.build(); - SessionFactoryBuilder sfb = metadata.getSessionFactoryBuilder(); + SessionFactoryBuilder sfb; + switch ( settingsMode ) { + case METADATA_SERVICE_REGISTRY: + sfb = metadata.getSessionFactoryBuilder(); + break; + case SESSION_FACTORY_SERVICE_REGISTRY: + serviceRegistry = createStandardServiceRegistry( configuredDefaultCatalog, configuredDefaultSchema ); + sfb = new SessionFactoryBuilderImpl( metadata, new SessionFactoryOptionsBuilder( serviceRegistry, + ((MetadataImpl) metadata).getBootstrapContext() ) ); + break; + default: + throw new IllegalStateException( "Unknown settings mode: " + settingsMode ); + } sessionFactory = (SessionFactoryImplementor) sfb.build(); toClose.add( sessionFactory ); From 9b47fcdfa825bc77003e4fb985b02bb2131d82e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Tue, 9 Nov 2021 18:02:28 +0100 Subject: [PATCH 014/256] HHH-14922 Test behavior when setting both implicit catalog/schema and default catalog/schema --- .../DefaultCatalogAndSchemaTest.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java index f249d0bd5468..f0c497a6efcf 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java @@ -80,7 +80,7 @@ import org.junit.runners.Parameterized; @RunWith(CustomParameterized.class) -@TestForIssue(jiraKey = "HHH-14921") +@TestForIssue(jiraKey = { "HHH-14921", "HHH-14922" }) public class DefaultCatalogAndSchemaTest { private static final String SQL_QUOTE_CHARACTER_CLASS = "([`\"]|\\[|\\])"; @@ -127,11 +127,11 @@ public static List params() { null, null, "someImplicitCatalog", "someImplicitSchema" } ); // HHH-14922: Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" -// params.add( new Object[] { mode, "implicit-global-catalog-and-schema.orm.xml", -// "someDefaultCatalog", "someDefaultSchema", -// // The implicit catalog/schema defined in the mapping should take precedence -// // over the default catalog/schema defined in settings. -// "someImplicitCatalog", "someImplicitSchema" } ); + params.add( new Object[] { mode, "implicit-global-catalog-and-schema.orm.xml", + "someDefaultCatalog", "someDefaultSchema", + // The implicit catalog/schema defined in the mapping should take precedence + // over the default catalog/schema defined in settings. + "someImplicitCatalog", "someImplicitSchema" } ); } return params; } From 795d5cd4e98a539790f2f6332e5399e506af8e20 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 10 Nov 2021 09:55:56 +0100 Subject: [PATCH 015/256] 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. --- .../boot/model/relational/Database.java | 50 +++++++++++-------- .../SqlStringGenerationContext.java | 12 +++++ .../SqlStringGenerationContextImpl.java | 46 +++++++++-------- .../source/internal/hbm/ModelBinder.java | 11 +--- .../org/hibernate/cfg/AnnotationBinder.java | 15 ------ .../java/org/hibernate/cfg/BinderHelper.java | 9 ---- .../main/java/org/hibernate/cfg/Settings.java | 4 +- .../cfg/annotations/TableBinder.java | 4 +- .../JPAXMLOverriddenAnnotationReader.java | 4 +- .../JPAXMLOverriddenMetadataProvider.java | 2 +- .../reflection/internal/XMLContext.java | 36 ++++++++----- .../internal/DatabaseInformationImpl.java | 14 ++++-- .../schema/internal/SchemaCreatorImpl.java | 9 ++-- .../id/sequences/HibernateSequenceTest.java | 4 +- .../JPAXMLOverriddenAnnotationReaderTest.java | 29 +++++++---- 15 files changed, 135 insertions(+), 114 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/Database.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/Database.java index ef77cb757248..5cf503dad07e 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/Database.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/Database.java @@ -35,7 +35,7 @@ public class Database { private final ServiceRegistry serviceRegistry; private final PhysicalNamingStrategy physicalNamingStrategy; - private Namespace implicitNamespace; + private Namespace.Name physicalImplicitNamespaceName; private List initCommands; public Database(MetadataBuildingOptions buildingOptions) { @@ -48,11 +48,16 @@ public Database(MetadataBuildingOptions buildingOptions, JdbcEnvironment jdbcEnv this.physicalNamingStrategy = buildingOptions.getPhysicalNamingStrategy(); this.dialect = determineDialect( buildingOptions ); - this.implicitNamespace = makeNamespace( - new Namespace.Name( - toIdentifier( buildingOptions.getMappingDefaults().getImplicitCatalogName() ), - toIdentifier( buildingOptions.getMappingDefaults().getImplicitSchemaName() ) - ) + setImplicitNamespaceName( + toIdentifier( buildingOptions.getMappingDefaults().getImplicitCatalogName() ), + 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 Iterable getNamespaces() { 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() { - return implicitNamespace; + return locateNamespace( null, null ); } - public Namespace locateNamespace(Identifier catalogName, Identifier schemaName) { - if ( catalogName == null && schemaName == null ) { - return getDefaultNamespace(); - } + /** + * @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) { final Namespace.Name name = new Namespace.Name( catalogName, schemaName ); Namespace namespace = namespaceMap.get( name ); if ( namespace == null ) { @@ -126,17 +141,8 @@ public Namespace locateNamespace(Identifier catalogName, Identifier schemaName) } public Namespace adjustDefaultNamespace(Identifier catalogName, Identifier schemaName) { - final Namespace.Name name = new Namespace.Name( catalogName, schemaName ); - if ( implicitNamespace.getName().equals( name ) ) { - return implicitNamespace; - } - - Namespace namespace = namespaceMap.get( name ); - if ( namespace == null ) { - namespace = makeNamespace( name ); - } - implicitNamespace = namespace; - return implicitNamespace; + setImplicitNamespaceName( catalogName, schemaName ); + return locateNamespace( catalogName, schemaName ); } public Namespace adjustDefaultNamespace(String implicitCatalogName, String implicitSchemaName) { diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java index fcd682ae7e44..d808e7c20ef2 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/SqlStringGenerationContext.java @@ -36,6 +36,12 @@ public interface SqlStringGenerationContext { */ 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. * May be {@code null}. @@ -44,6 +50,12 @@ public interface SqlStringGenerationContext { */ 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 * diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java index 1b395e317e6c..05091caa25d8 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java @@ -47,7 +47,7 @@ public static SqlStringGenerationContext fromConfigurationMap(JdbcEnvironment jd */ public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment, Database database, String defaultCatalog, String defaultSchema) { - Namespace.Name implicitNamespaceName = database.getDefaultNamespace().getPhysicalName(); + Namespace.Name implicitNamespaceName = database.getPhysicalImplicitNamespaceName(); IdentifierHelper identifierHelper = jdbcEnvironment.getIdentifierHelper(); NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport(); Identifier actualDefaultCatalog = null; @@ -108,30 +108,25 @@ public Identifier getDefaultCatalog() { } @Override - public Identifier getDefaultSchema() { - return defaultSchema; - } - - @Override - public String format(QualifiedTableName qualifiedName) { - return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); + public Identifier catalogWithDefault(Identifier explicitCatalogOrNull) { + return explicitCatalogOrNull != null ? explicitCatalogOrNull : defaultCatalog; } @Override - public String format(QualifiedSequenceName qualifiedName) { - return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); + public Identifier getDefaultSchema() { + return defaultSchema; } @Override - public String format(QualifiedName qualifiedName) { - return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); + 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( withDefault( name.getCatalogName(), defaultCatalog ), - withDefault( name.getSchemaName(), defaultSchema ), name.getTableName() ); + return new QualifiedTableName( catalogWithDefault( name.getCatalogName() ), + schemaWithDefault( name.getSchemaName() ), name.getTableName() ); } return name; } @@ -139,8 +134,8 @@ private QualifiedTableName withDefaults(QualifiedTableName 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 new QualifiedSequenceName( catalogWithDefault( name.getCatalogName() ), + schemaWithDefault( name.getSchemaName() ), name.getSequenceName() ); } return name; } @@ -148,14 +143,25 @@ private QualifiedSequenceName withDefaults(QualifiedSequenceName 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 new QualifiedSequenceName( catalogWithDefault( name.getCatalogName() ), + schemaWithDefault( name.getSchemaName() ), name.getObjectName() ); } return name; } - private static Identifier withDefault(Identifier value, Identifier defaultValue) { - return value != null ? value : defaultValue; + @Override + public String format(QualifiedTableName qualifiedName) { + return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); + } + + @Override + public String format(QualifiedSequenceName qualifiedName) { + return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); + } + + @Override + public String format(QualifiedName qualifiedName) { + return qualifiedObjectNameFormatter.format( withDefaults( qualifiedName ), dialect ); } @Override diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java index 5d63c44fcfe3..e0f7310847d1 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/source/internal/hbm/ModelBinder.java @@ -804,15 +804,6 @@ private void makeIdentifier( // YUCK! but cannot think of a clean way to do this given the string-config based scheme 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() ); identifierValue.setIdentifierGeneratorProperties( params ); @@ -2966,7 +2957,7 @@ private Identifier determineSchemaName(TableSpecificationSource tableSpecSource) return database.toIdentifier( tableSpecSource.getExplicitSchemaName() ); } else { - return database.toIdentifier( metadataBuildingContext.getMappingDefaults().getImplicitSchemaName() ); + return null; } } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java index 786acc6b1296..3881e9912105 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/AnnotationBinder.java @@ -149,7 +149,6 @@ import org.hibernate.cfg.internal.NullableDiscriminatorColumnSecondPass; import org.hibernate.engine.OptimisticLockStyle; import org.hibernate.engine.spi.FilterDefinition; -import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.internal.CoreMessageLogger; import org.hibernate.internal.util.StringHelper; import org.hibernate.jpa.event.internal.CallbackDefinitionResolverLegacyImpl; @@ -467,20 +466,6 @@ private static IdentifierGeneratorDefinition buildIdGenerator( 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 ) { context.getBuildingOptions().getIdGenerationTypeInterpreter().interpretTableGenerator( (TableGenerator) generatorAnn, diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java b/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java index 4dd9882d5a17..b30c2180c54f 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/BinderHelper.java @@ -525,15 +525,6 @@ public static void makeIdGenerator( 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 ) { params.setProperty( PersistentIdentifierGenerator.PK, diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java index 3203190d9086..1b89ae77ed4c 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java @@ -50,8 +50,8 @@ public Settings(SessionFactoryOptions sessionFactoryOptions) { public Settings(SessionFactoryOptions sessionFactoryOptions, Metadata metadata) { this( sessionFactoryOptions, - extractName( metadata.getDatabase().getDefaultNamespace().getName().getCatalog() ), - extractName( metadata.getDatabase().getDefaultNamespace().getName().getSchema() ) + extractName( metadata.getDatabase().getPhysicalImplicitNamespaceName().getCatalog() ), + extractName( metadata.getDatabase().getPhysicalImplicitNamespaceName().getSchema() ) ); } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java index 2dfb2d132e87..7b9f7c5eff7b 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/TableBinder.java @@ -477,10 +477,10 @@ public static Table buildAndFillTable( String subselect, InFlightMetadataCollector.EntityTableXref denormalizedSuperTableXref) { schema = BinderHelper.isEmptyOrNullAnnotationValue( schema ) - ? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitSchemaName() + ? null : schema; catalog = BinderHelper.isEmptyOrNullAnnotationValue( catalog ) - ? buildingContext.getBuildingOptions().getMappingDefaults().getImplicitCatalogName() + ? null : catalog; final Table table; diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenAnnotationReader.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenAnnotationReader.java index 8a8c3167522c..a020b8607da1 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenAnnotationReader.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenAnnotationReader.java @@ -407,7 +407,9 @@ public Annotation[] getAnnotations() { */ private void initAnnotations() { 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 ) { //is a class ManagedType managedTypeOverride = xmlContext.getManagedTypeOverride( className ); diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenMetadataProvider.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenMetadataProvider.java index fef5c77f0b3f..afd35add4866 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenMetadataProvider.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/JPAXMLOverriddenMetadataProvider.java @@ -94,7 +94,7 @@ public Map getDefaults() { else { if ( defaults == null ) { defaults = new HashMap<>(); - XMLContext.Default xmlDefaults = xmlContext.getDefault( null ); + XMLContext.Default xmlDefaults = xmlContext.getDefaultWithGlobalCatalogAndSchema(); defaults.put( "schema", xmlDefaults.getSchema() ); defaults.put( "catalog", xmlDefaults.getCatalog() ); diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/XMLContext.java b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/XMLContext.java index 06f1da27f913..c43223900ead 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/XMLContext.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/annotations/reflection/internal/XMLContext.java @@ -124,12 +124,12 @@ private void addClass(List managedTypes, String packageNa managedTypeOverride.put( className, element ); Default mergedDefaults = new Default(); // Apply entity mapping defaults - mergedDefaults.override( defaults ); + mergedDefaults.overrideWithCatalogAndSchema( defaults ); // ... then apply entity settings Default fileDefaults = new Default(); fileDefaults.setMetadataComplete( element.isMetadataComplete() ); fileDefaults.setAccess( element.getAccess() ); - mergedDefaults.override( fileDefaults ); + mergedDefaults.overrideWithCatalogAndSchema( fileDefaults ); // ... and we get the merged defaults for that entity defaultsOverride.put( className, mergedDefaults ); @@ -196,16 +196,22 @@ public static String buildSafeClassName(String className, Default defaults) { return buildSafeClassName( className, defaults.getPackageName() ); } - public Default getDefault(String className) { + public Default getDefaultWithoutGlobalCatalogAndSchema(String className) { Default xmlDefault = new Default(); - xmlDefault.override( globalDefaults ); + xmlDefault.overrideWithoutCatalogAndSchema( globalDefaults ); if ( className != null ) { Default entityMappingOverriding = defaultsOverride.get( className ); - xmlDefault.override( entityMappingOverriding ); + xmlDefault.overrideWithCatalogAndSchema( entityMappingOverriding ); } return xmlDefault; } + public Default getDefaultWithGlobalCatalogAndSchema() { + Default xmlDefault = new Default(); + xmlDefault.overrideWithCatalogAndSchema( globalDefaults ); + return xmlDefault; + } + public ManagedType getManagedTypeOverride(String className) { return managedTypeOverride.get( className ); } @@ -292,7 +298,19 @@ void setCascadePersist(Boolean 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.getAccess() != null ) { access = globalDefault.getAccess(); @@ -300,12 +318,6 @@ public void override(Default globalDefault) { if ( globalDefault.getPackageName() != null ) { packageName = globalDefault.getPackageName(); } - if ( globalDefault.getSchema() != null ) { - schema = globalDefault.getSchema(); - } - if ( globalDefault.getCatalog() != null ) { - catalog = globalDefault.getCatalog(); - } if ( globalDefault.getDelimitedIdentifier() != null ) { delimitedIdentifier = globalDefault.getDelimitedIdentifier(); } diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java index 38748838b128..f2ad3077ad60 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/extract/internal/DatabaseInformationImpl.java @@ -32,6 +32,7 @@ public class DatabaseInformationImpl implements DatabaseInformation, ExtractionContext.DatabaseObjectAccess { private final JdbcEnvironment jdbcEnvironment; + private final SqlStringGenerationContext sqlStringGenerationContext; private final ExtractionContext extractionContext; private final InformationExtractor extractor; @@ -44,6 +45,7 @@ public DatabaseInformationImpl( DdlTransactionIsolator ddlTransactionIsolator, SchemaManagementTool tool) throws SQLException { this.jdbcEnvironment = jdbcEnvironment; + this.sqlStringGenerationContext = sqlStringGenerationContext; this.extractionContext = tool.getExtractionTool().createExtractionContext( serviceRegistry, jdbcEnvironment, @@ -78,12 +80,13 @@ private void initializeSequences() throws SQLException { @Override public boolean catalogExists(Identifier catalog) { - return extractor.catalogExists( catalog ); + return extractor.catalogExists( sqlStringGenerationContext.catalogWithDefault( catalog ) ); } @Override 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 @@ -108,15 +111,16 @@ public TableInformation getTableInformation(QualifiedTableName tableName) { } return extractor.getTable( - tableName.getCatalogName(), - tableName.getSchemaName(), + sqlStringGenerationContext.catalogWithDefault( tableName.getCatalogName() ), + sqlStringGenerationContext.schemaWithDefault( tableName.getSchemaName() ), tableName.getTableName() ); } @Override 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 diff --git a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java index 0d14dcabf768..529558e55c09 100644 --- a/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/tool/schema/internal/SchemaCreatorImpl.java @@ -235,7 +235,8 @@ public void createFromMetadata( if ( tryToCreateCatalogs ) { 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 ) ) { applySqlStrings( @@ -248,9 +249,11 @@ public void createFromMetadata( } } - if ( tryToCreateSchemas && namespace.getPhysicalName().getSchema() != null ) { + final Identifier schemaPhysicalName = + sqlStringGenerationContext.schemaWithDefault( namespace.getPhysicalName().getSchema() ); + if ( tryToCreateSchemas && schemaPhysicalName != null ) { applySqlStrings( - dialect.getCreateSchemaCommand( namespace.getPhysicalName().getSchema().render( dialect ) ), + dialect.getCreateSchemaCommand( schemaPhysicalName.render( dialect ) ), formatter, options, targets diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java index b8fe8eca1196..efd1b47d596e 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/id/sequences/HibernateSequenceTest.java @@ -11,6 +11,7 @@ import org.hibernate.Session; import org.hibernate.Transaction; +import org.hibernate.boot.model.relational.SqlStringGenerationContext; import org.hibernate.cfg.Configuration; import org.hibernate.dialect.H2Dialect; import org.hibernate.id.IdentifierGenerator; @@ -54,9 +55,10 @@ public void testHibernateSequenceSchema() { IdentifierGenerator generator = persister.getIdentifierGenerator(); Assert.assertTrue( SequenceStyleGenerator.class.isInstance( generator ) ); SequenceStyleGenerator seqGenerator = (SequenceStyleGenerator) generator; + SqlStringGenerationContext sqlStringGenerationContext = sessionFactory().getSqlStringGenerationContext(); Assert.assertEquals( SCHEMA_NAME + "." + SequenceStyleGenerator.DEF_SEQUENCE_NAME, - seqGenerator.getDatabaseStructure().getPhysicalName().render() + sqlStringGenerationContext.format( seqGenerator.getDatabaseStructure().getPhysicalName() ) ); } diff --git a/hibernate-core/src/test/java/org/hibernate/test/annotations/reflection/JPAXMLOverriddenAnnotationReaderTest.java b/hibernate-core/src/test/java/org/hibernate/test/annotations/reflection/JPAXMLOverriddenAnnotationReaderTest.java index 1c12a7a146cd..dcf8d8c7d47b 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/annotations/reflection/JPAXMLOverriddenAnnotationReaderTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/annotations/reflection/JPAXMLOverriddenAnnotationReaderTest.java @@ -64,7 +64,9 @@ public void testEntityRelatedAnnotations() throws Exception { ); assertNotNull( reader.getAnnotation( Table.class ) ); 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( "Proper @Table.uniqueConstraints", 2, reader.getAnnotation( Table.class ).uniqueConstraints()[0].columnNames().length @@ -88,7 +90,9 @@ public void testEntityRelatedAnnotations() throws Exception { assertEquals( "default fails", 50, reader.getAnnotation( SequenceGenerator.class ).allocationSize() ); assertNotNull( "TableOverriding not working", reader.getAnnotation( TableGenerator.class ) ); 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 ); assertNotNull( reader.getAnnotation( Table.class ) ); @@ -98,10 +102,14 @@ public void testEntityRelatedAnnotations() throws Exception { assertEquals( "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 ) ); + // The default schema is assigned later, when we generate SQL. + // See DefaultCatalogAndSchemaTest. assertEquals( - "Default schema not taken into account", "myschema", + "Default schema not taken into account", "", reader.getAnnotation( SecondaryTables.class ).value()[0].schema() ); assertNotNull( reader.getAnnotation( Inheritance.class ) ); @@ -194,15 +202,14 @@ public void testEntityRelatedAnnotationsMetadataComplete() throws Exception { assertEquals( "Metadata complete should ignore java annotations", "", reader.getAnnotation( Entity.class ).name() ); - assertNotNull( reader.getAnnotation( Table.class ) ); - assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); - assertEquals( "Default schema not overriden", "myschema", reader.getAnnotation( Table.class ).schema() ); + // The default schema is assigned later, when we generate SQL. + // See DefaultCatalogAndSchemaTest. + assertNull( "Default schema overridden too soon", reader.getAnnotation( Table.class ) ); reader = new JPAXMLOverriddenAnnotationReader( Match.class, context, bootstrapContext ); - assertNotNull( reader.getAnnotation( Table.class ) ); - assertEquals( "@Table should not be used", "", reader.getAnnotation( Table.class ).name() ); - assertEquals( "Overriding not taken into account", "myschema", 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. + assertNull( "Default schema overridden too soon", reader.getAnnotation( Table.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTable.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( SecondaryTables.class ) ); assertNull( "Ignore Java annotation", reader.getAnnotation( Inheritance.class ) ); From 67e09b12908de27686169ade8d590b5b7ea1f9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Wed, 10 Nov 2021 09:57:31 +0100 Subject: [PATCH 016/256] HHH-14922 Give precedence to default catalog/schema over implicit catalog/schema --- .../SqlStringGenerationContextImpl.java | 18 ++++++++++-------- .../main/java/org/hibernate/cfg/Settings.java | 4 ++-- .../DefaultCatalogAndSchemaTest.java | 6 +++--- 3 files changed, 15 insertions(+), 13 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java index 05091caa25d8..bef59f450300 100644 --- a/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/boot/model/relational/internal/SqlStringGenerationContextImpl.java @@ -41,8 +41,8 @@ public static SqlStringGenerationContext fromConfigurationMap(JdbcEnvironment jd /** * @param jdbcEnvironment The JDBC environment, to extract the dialect, identifier helper, etc. * @param database The database metadata, to retrieve the implicit namespace name configured through XML mapping. - * @param defaultCatalog The default catalog to use, unless an implicit catalog was configured through XML mapping. - * @param defaultSchema The default schema to use, unless an implicit schema was configured through XML mapping. + * @param defaultCatalog The default catalog to use; if {@code null}, will use the implicit catalog that was configured through XML mapping. + * @param defaultSchema The default schema to use; if {@code null}, will use the implicit schema that was configured through XML mapping. * @return An {@link SqlStringGenerationContext}. */ public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnvironment, @@ -52,15 +52,17 @@ public static SqlStringGenerationContext fromExplicit(JdbcEnvironment jdbcEnviro NameQualifierSupport nameQualifierSupport = jdbcEnvironment.getNameQualifierSupport(); Identifier actualDefaultCatalog = null; if ( nameQualifierSupport.supportsCatalogs() ) { - actualDefaultCatalog = implicitNamespaceName.getCatalog() != null - ? implicitNamespaceName.getCatalog() - : identifierHelper.toIdentifier( defaultCatalog ); + actualDefaultCatalog = identifierHelper.toIdentifier( defaultCatalog ); + if ( actualDefaultCatalog == null ) { + actualDefaultCatalog = implicitNamespaceName.getCatalog(); + } } Identifier actualDefaultSchema = null; if ( nameQualifierSupport.supportsSchemas() ) { - actualDefaultSchema = implicitNamespaceName.getSchema() != null - ? implicitNamespaceName.getSchema() - : identifierHelper.toIdentifier( defaultSchema ); + actualDefaultSchema = identifierHelper.toIdentifier( defaultSchema ); + if ( defaultSchema == null ) { + actualDefaultSchema = implicitNamespaceName.getSchema(); + } } return new SqlStringGenerationContextImpl( jdbcEnvironment, actualDefaultCatalog, actualDefaultSchema ); } diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java index 1b89ae77ed4c..ad9c46ad38e9 100644 --- a/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java +++ b/hibernate-core/src/main/java/org/hibernate/cfg/Settings.java @@ -61,8 +61,8 @@ private static String extractName(Identifier identifier) { public Settings(SessionFactoryOptions sessionFactoryOptions, String defaultCatalogName, String defaultSchemaName) { this.sessionFactoryOptions = sessionFactoryOptions; - this.defaultCatalogName = defaultCatalogName != null ? defaultCatalogName : sessionFactoryOptions.getDefaultCatalog(); - this.defaultSchemaName = defaultSchemaName != null ? defaultSchemaName : sessionFactoryOptions.getDefaultSchema(); + this.defaultCatalogName = sessionFactoryOptions.getDefaultCatalog() != null ? sessionFactoryOptions.getDefaultCatalog() : defaultCatalogName; + this.defaultSchemaName = sessionFactoryOptions.getDefaultSchema() != null ? sessionFactoryOptions.getDefaultSchema() : defaultSchemaName; if ( LOG.isDebugEnabled() ) { LOG.debugf( "SessionFactory name : %s", sessionFactoryOptions.getSessionFactoryName() ); diff --git a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java index f0c497a6efcf..37fc2926bbaf 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/boot/database/qualfiedTableNaming/DefaultCatalogAndSchemaTest.java @@ -129,9 +129,9 @@ public static List params() { // HHH-14922: Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" params.add( new Object[] { mode, "implicit-global-catalog-and-schema.orm.xml", "someDefaultCatalog", "someDefaultSchema", - // The implicit catalog/schema defined in the mapping should take precedence - // over the default catalog/schema defined in settings. - "someImplicitCatalog", "someImplicitSchema" } ); + // The default catalog/schema should replace the + // implicit catalog/schema defined in the mapping. + "someDefaultCatalog", "someDefaultSchema" } ); } return params; } From dc00552cf5a6f95ed9b03d0bc17293db789904f0 Mon Sep 17 00:00:00 2001 From: Hibernate-CI Date: Wed, 8 Dec 2021 13:03:25 +0000 Subject: [PATCH 017/256] 5.6.2.Final --- changelog.txt | 27 +++++++++++++++++++++++++++ gradle/version.properties | 2 +- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 35e957f9c6f1..3bcb0aef47cc 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,33 @@ Hibernate 5 Changelog Note: Please refer to JIRA to learn more about each issue. +Changes in 5.6.2.Final (December 08, 2021) +------------------------------------------------------------------------------------------------------------------------ + +https://hibernate.atlassian.net/projects/HHH/versions/32001 + +** Bug + * [HHH-14956] - Invalid link to MetadataBuilderContributor javadocs in Configurations docs + * [HHH-14937] - SybaseDialect does not support schema anymore + * [HHH-14936] - JdbcConnectionContext in hibernate-testing throws NPE when user/password are not provided in configuration + * [HHH-14935] - Type annotation is deprecated without an available replacement + * [HHH-14927] - "Current" documentation is 5.5 instead of 5.6 + * [HHH-14926] - fix asciidoc error in 'test-case-guide.adoc' + * [HHH-14922] - Inconsistent precedence of orm.xml implicit catalog/schema over "default_catalog"/"default_schema" + * [HHH-14918] - Key-to-one to id-class entity with key-to-one doesn't work anymore + * [HHH-14916] - JPA Critera query Join on Fetch not working + * [HHH-14540] - Interceptor instance is shared between ORM session and Enver's temporary session resulting in multiple calls. + * [HHH-14211] - @Lob String mapping broken + +** Improvement + * [HHH-14921] - Definition of the default catalog/schema on session factory creation + * [HHH-14903] - Method getConfiguredJdbcBatchSize can be optimised for StatelessSession as well + * [HHH-14897] - Allow ordering with nulls first/last from JPA implementation + +** Task + * [HHH-14938] - Upgrade to MySQL Connector/J 8.0.27 + + Changes in 5.6.1.Final (October 27, 2021) ------------------------------------------------------------------------------------------------------------------------ diff --git a/gradle/version.properties b/gradle/version.properties index 5c72c9b3ea00..5298d1f40ec3 100644 --- a/gradle/version.properties +++ b/gradle/version.properties @@ -1 +1 @@ -hibernateVersion=5.6.2-SNAPSHOT \ No newline at end of file +hibernateVersion=5.6.2.Final \ No newline at end of file From f6f765426b6541e3a144ebff69e004d950e4b507 Mon Sep 17 00:00:00 2001 From: Hibernate-CI Date: Wed, 8 Dec 2021 13:08:18 +0000 Subject: [PATCH 018/256] 5.6.3-SNAPSHOT --- gradle/version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/version.properties b/gradle/version.properties index 5298d1f40ec3..998d3b40c681 100644 --- a/gradle/version.properties +++ b/gradle/version.properties @@ -1 +1 @@ -hibernateVersion=5.6.2.Final \ No newline at end of file +hibernateVersion=5.6.3-SNAPSHOT \ No newline at end of file From fc957ec91e17197b9ef6fbef514f16c38b334de6 Mon Sep 17 00:00:00 2001 From: Ivaylo Mitrev Date: Thu, 2 Dec 2021 17:38:26 +0200 Subject: [PATCH 019/256] HHH-14948 - Reduce the size of the imports cache in the metamodel We have agreed to mitigate a memory issue by introducing a hard-coded (for the time being) cap on the imports cache in MetamodelImpl. This would preserve the previously available performance improvement for the majority of applications using Hibernate (which are expected to have less than 1000 imports) while mitigating an unbounded memory consumption issue for applications that exceed this limit when dynamically generating queries with random entity aliases. The commit also adds a not-so-beautiful test, which, however, is beneficial considering the consequences of introduing a regression. --- .../metamodel/internal/MetamodelImpl.java | 8 +++++- .../hibernate/test/hql/QuerySplitterTest.java | 27 +++++++++++++++++++ 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetamodelImpl.java b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetamodelImpl.java index 055485700e8d..19c63b85033a 100755 --- a/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetamodelImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/metamodel/internal/MetamodelImpl.java @@ -632,7 +632,13 @@ public String getImportedClassName(String className) { return className; } catch ( ClassLoadingException cnfe ) { - imports.put( className, INVALID_IMPORT ); + // This check doesn't necessarily mean that the map can't exceed 1000 elements because + // new entries might be added _while_ performing the check (making it 1000+ since size() isn't + // synchronized). Regardless, this would pass as "good enough" to prevent the map from growing + // above a certain threshold, thus, avoiding memory issues. + if ( imports.size() < 1_000 ) { + imports.put( className, INVALID_IMPORT ); + } return null; } } diff --git a/hibernate-core/src/test/java/org/hibernate/test/hql/QuerySplitterTest.java b/hibernate-core/src/test/java/org/hibernate/test/hql/QuerySplitterTest.java index 8fe9115577a6..54f3015169e1 100644 --- a/hibernate-core/src/test/java/org/hibernate/test/hql/QuerySplitterTest.java +++ b/hibernate-core/src/test/java/org/hibernate/test/hql/QuerySplitterTest.java @@ -6,11 +6,15 @@ */ package org.hibernate.test.hql; +import java.lang.reflect.Field; +import java.util.Map; +import java.util.stream.IntStream; import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; import org.hibernate.hql.internal.QuerySplitter; +import org.hibernate.metamodel.internal.MetamodelImpl; import org.hibernate.testing.TestForIssue; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; @@ -47,6 +51,29 @@ public void testQueryWithEntityNameAsStringLiteral2() { ); } + @Test + @TestForIssue(jiraKey = "HHH-14948") + public void testMemoryConsumptionOfFailedImportsCache() throws NoSuchFieldException, IllegalAccessException { + + IntStream.range( 0, 1001 ) + .forEach( i -> QuerySplitter.concreteQueries( + "from Employee e join e.company" + i, + sessionFactory() + ) ); + + MetamodelImpl metamodel = (MetamodelImpl) sessionFactory().getMetamodel(); + + Field field = MetamodelImpl.class.getDeclaredField( "imports" ); + field.setAccessible( true ); + + //noinspection unchecked + Map imports = (Map) field.get( metamodel ); + + // VERY hard-coded, but considering the possibility of a regression of a memory-related issue, + // it should be worth it + assertEquals( 1000, imports.size() ); + } + @Test @TestForIssue(jiraKey = "HHH-7973" ) public void testQueryWithEntityNameAsStringLiteralAndEscapeQuoteChar() { From ad8723c31b5214a3d9f62db7377ba8144b333043 Mon Sep 17 00:00:00 2001 From: Sebastian Nohn Date: Fri, 10 Dec 2021 14:05:15 +0100 Subject: [PATCH 020/256] HHH-14972 bump log4j to 2.15.0 fixing an RCE (CVE-2021-44228) --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 7ddc2ff28f03..32a22bc26f61 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -116,7 +116,7 @@ ext { // ~~~~~~~~~~~~~~~~~~~~~~~~~~ testing - log4j2: "org.apache.logging.log4j:log4j-core:2.14.1", + log4j2: "org.apache.logging.log4j:log4j-core:2.15.0", junit: "junit:junit:${junitVersion}", byteman: "org.jboss.byteman:byteman:${bytemanVersion}", byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}", From ab808954a27ca9cca67979457f3a3e9d5d868469 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Tue, 14 Dec 2021 21:45:29 +0000 Subject: [PATCH 021/256] HHH-14979 Upgrade to Log4J 2 2.16.0 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 32a22bc26f61..5b057b101481 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -116,7 +116,7 @@ ext { // ~~~~~~~~~~~~~~~~~~~~~~~~~~ testing - log4j2: "org.apache.logging.log4j:log4j-core:2.15.0", + log4j2: "org.apache.logging.log4j:log4j-core:2.16.0", junit: "junit:junit:${junitVersion}", byteman: "org.jboss.byteman:byteman:${bytemanVersion}", byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}", From 8d1027f96770196d9e42233b0d433f0209fafa6b Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Wed, 15 Dec 2021 20:31:57 +0000 Subject: [PATCH 022/256] HHH-14935 Revert deprecation of org.hibernate.annotations.Type, TypeDef and TypeDefs --- .../src/main/java/org/hibernate/annotations/Type.java | 3 --- .../src/main/java/org/hibernate/annotations/TypeDef.java | 3 --- .../src/main/java/org/hibernate/annotations/TypeDefs.java | 3 --- 3 files changed, 9 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/Type.java b/hibernate-core/src/main/java/org/hibernate/annotations/Type.java index 3290021b77c8..8b8e40ea172b 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/Type.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/Type.java @@ -24,12 +24,9 @@ * * @author Emmanuel Bernard * @author Steve Ebersole - * - * @deprecated 6.0 will introduce a new type-safe {@code CustomType} annotation */ @Target({FIELD, METHOD}) @Retention(RUNTIME) -@Deprecated public @interface Type { /** * The Hibernate type name. Usually the fully qualified name of an implementation class for diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/TypeDef.java b/hibernate-core/src/main/java/org/hibernate/annotations/TypeDef.java index 51f7c8abe7d4..4810824de0e6 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/TypeDef.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/TypeDef.java @@ -28,13 +28,10 @@ * * @author Emmanuel Bernard * @author Steve Ebersole - * - * @deprecated 6.0 will introduce a new series of type-safe annotations to serve the same purpose */ @Target({TYPE, PACKAGE}) @Retention(RUNTIME) @Repeatable(TypeDefs.class) -@Deprecated public @interface TypeDef { /** * The type name. This is the name that would be used in other locations. diff --git a/hibernate-core/src/main/java/org/hibernate/annotations/TypeDefs.java b/hibernate-core/src/main/java/org/hibernate/annotations/TypeDefs.java index cdc175b0e282..6f05951eafc4 100644 --- a/hibernate-core/src/main/java/org/hibernate/annotations/TypeDefs.java +++ b/hibernate-core/src/main/java/org/hibernate/annotations/TypeDefs.java @@ -18,12 +18,9 @@ * * @author Emmanuel Bernard * @author Steve Ebersole - * - * @deprecated 6.0 will introduce a new series of type-safe annotations to serve the same purpose */ @Target({TYPE, PACKAGE}) @Retention(RUNTIME) -@Deprecated public @interface TypeDefs { /** * The grouping of type definitions. From 2607c9150241bb5fd71f6a339aae6168b45a0044 Mon Sep 17 00:00:00 2001 From: Hibernate-CI Date: Wed, 15 Dec 2021 22:20:26 +0000 Subject: [PATCH 023/256] 5.6.3.Final --- changelog.txt | 14 ++++++++++++++ gradle/version.properties | 2 +- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/changelog.txt b/changelog.txt index 3bcb0aef47cc..4337deb1b0db 100644 --- a/changelog.txt +++ b/changelog.txt @@ -3,6 +3,20 @@ Hibernate 5 Changelog Note: Please refer to JIRA to learn more about each issue. +Changes in 5.6.3.Final (December 15, 2021) +------------------------------------------------------------------------------------------------------------------------ + +https://hibernate.atlassian.net/projects/HHH/versions/32006 + +** Bug + * [HHH-14972] - log4j2 <= 2.14.1 has an RCE (CVE-2021-44228) + * [HHH-14948] - Metamodel imports cache increases indefinitely for dynamically generated HQL aliases eventually leading to an OOM + * [HHH-14935] - Type annotation is deprecated without an available replacement + +** Task + * [HHH-14979] - Upgrade to Log4J 2 2.16.0 + + Changes in 5.6.2.Final (December 08, 2021) ------------------------------------------------------------------------------------------------------------------------ diff --git a/gradle/version.properties b/gradle/version.properties index 998d3b40c681..8c9b9ac012dd 100644 --- a/gradle/version.properties +++ b/gradle/version.properties @@ -1 +1 @@ -hibernateVersion=5.6.3-SNAPSHOT \ No newline at end of file +hibernateVersion=5.6.3.Final \ No newline at end of file From 373ac4e1172a6b7f20d12cc58d3fc41c2e5096a0 Mon Sep 17 00:00:00 2001 From: Hibernate-CI Date: Wed, 15 Dec 2021 22:27:45 +0000 Subject: [PATCH 024/256] 5.6.4-SNAPSHOT --- gradle/version.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/version.properties b/gradle/version.properties index 8c9b9ac012dd..6efeb0d047b9 100644 --- a/gradle/version.properties +++ b/gradle/version.properties @@ -1 +1 @@ -hibernateVersion=5.6.3.Final \ No newline at end of file +hibernateVersion=5.6.4-SNAPSHOT \ No newline at end of file From 29a8e533b214c6ccbb30014fe40d2a215bb60303 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Thu, 16 Dec 2021 22:01:04 +0000 Subject: [PATCH 025/256] HHH-14988 Upgrade to ByteBuddy 1.12.5 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 5b057b101481..01d6a9bb6c00 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -24,7 +24,7 @@ ext { weldVersion = '3.1.5.Final' jakartaWeldVersion = '4.0.1.SP1' - byteBuddyVersion = '1.11.20' + byteBuddyVersion = '1.12.5' agroalVersion = '1.9' From 6f77882fbaeba4931c53445947bb500df00ea5ec Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Sat, 18 Dec 2021 10:21:54 +0000 Subject: [PATCH 026/256] HHH-14987 Upgrade to Log4j 2.17.0 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 01d6a9bb6c00..2aee8e6005cb 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -116,7 +116,7 @@ ext { // ~~~~~~~~~~~~~~~~~~~~~~~~~~ testing - log4j2: "org.apache.logging.log4j:log4j-core:2.16.0", + log4j2: "org.apache.logging.log4j:log4j-core:2.17.0", junit: "junit:junit:${junitVersion}", byteman: "org.jboss.byteman:byteman:${bytemanVersion}", byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}", From 11552b3e93a4f07b2d4968b490810dd6a04d62cc Mon Sep 17 00:00:00 2001 From: Filipe Roque Date: Mon, 3 Jan 2022 19:01:16 +0000 Subject: [PATCH 027/256] HHH-15002 H2 supports 'true' and 'false' boolean literals Cherry picked from 1706141ffc154c1b61e304445a603ebf9a3e0a2e --- .../src/main/java/org/hibernate/dialect/H2Dialect.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java index 319b64943d9d..e114f79769cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/H2Dialect.java @@ -245,6 +245,11 @@ public String getForUpdateString() { return " for update"; } + @Override + public String toBooleanValueString(boolean bool) { + return String.valueOf( bool ); + } + @Override public LimitHandler getLimitHandler() { return LIMIT_HANDLER; From 0496515252045384156caef9664f3a104280674d Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Mon, 10 Jan 2022 15:18:05 +0000 Subject: [PATCH 028/256] HHH-14998 Upgrade to GraalVM SDK 21.3.0 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 2aee8e6005cb..d020731c5a5b 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -44,7 +44,7 @@ ext { jakartaJaxbRuntimeVersion = '3.0.0' //GraalVM - graalvmVersion = '21.2.0' + graalvmVersion = '21.3.0' micrometerVersion = '1.6.1' From 7c67cf72d13d33ad70477ed701867f9a5fbfe159 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Mon, 10 Jan 2022 15:55:41 +0000 Subject: [PATCH 029/256] HHH-15018 OracleTypesHelper shouldn't log stacktraces when the Oracle JDBC driver isn't loadable --- .../src/main/java/org/hibernate/dialect/OracleTypesHelper.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/hibernate-core/src/main/java/org/hibernate/dialect/OracleTypesHelper.java b/hibernate-core/src/main/java/org/hibernate/dialect/OracleTypesHelper.java index 4b757ab4385a..8c18edd73978 100644 --- a/hibernate-core/src/main/java/org/hibernate/dialect/OracleTypesHelper.java +++ b/hibernate-core/src/main/java/org/hibernate/dialect/OracleTypesHelper.java @@ -36,7 +36,7 @@ private OracleTypesHelper() { typeCode = extractOracleCursorTypeValue(); } catch (Exception e) { - log.warn( "Unable to resolve Oracle CURSOR JDBC type code", e ); + log.warn( "Unable to resolve Oracle CURSOR JDBC type code: the class OracleTypesHelper was initialized but the Oracle JDBC driver could not be loaded." ); } oracleCursorTypeSqlType = typeCode; } From a4dde380b7d7009a2dcce70898a8b64c80df6037 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Wed, 12 Jan 2022 11:11:23 +0000 Subject: [PATCH 030/256] HHH-15024 Upgrade to Jandex 2.4.2.Final --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index d020731c5a5b..a0b1014a1995 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -57,7 +57,7 @@ ext { // Annotations commons_annotations: "org.hibernate.common:hibernate-commons-annotations:${hibernateCommonsVersion}", - jandex: 'org.jboss:jandex:2.2.3.Final', + jandex: 'org.jboss:jandex:2.4.2.Final', classmate: 'com.fasterxml:classmate:1.5.1', // Dom4J From 3b94ea5f69d40cbd52db83339d15f65503e5b5ad Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Wed, 12 Jan 2022 15:47:57 +0000 Subject: [PATCH 031/256] HHH-15026 Upgrade to Log4J 2.17.1 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index a0b1014a1995..5ed129a99c5f 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -116,7 +116,7 @@ ext { // ~~~~~~~~~~~~~~~~~~~~~~~~~~ testing - log4j2: "org.apache.logging.log4j:log4j-core:2.17.0", + log4j2: "org.apache.logging.log4j:log4j-core:2.17.1", junit: "junit:junit:${junitVersion}", byteman: "org.jboss.byteman:byteman:${bytemanVersion}", byteman_install: "org.jboss.byteman:byteman-install:${bytemanVersion}", From be0f01a6ba6e4019e144a6168354f018fa213f6b Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Fri, 14 Jan 2022 12:17:49 +0000 Subject: [PATCH 032/256] HHH-15028 Upgrade to JBoss Logging 3.4.3.Final --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index 5ed129a99c5f..fdb0de62e85f 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -88,7 +88,7 @@ ext { jakarta_cdi: 'jakarta.enterprise:jakarta.enterprise.cdi-api:3.0.0', // logging - logging: 'org.jboss.logging:jboss-logging:3.4.2.Final', + logging: 'org.jboss.logging:jboss-logging:3.4.3.Final', logging_annotations: 'org.jboss.logging:jboss-logging-annotations:2.1.0.Final', logging_processor: 'org.jboss.logging:jboss-logging-processor:2.1.0.Final', From fdd4eb3854e5319b102976175ced5d339bcb51e2 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Sat, 15 Jan 2022 16:41:44 +0000 Subject: [PATCH 033/256] HHH-15031 Upgrade to ByteBuddy 1.12.7 --- gradle/libraries.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libraries.gradle b/gradle/libraries.gradle index fdb0de62e85f..ba9581f1d5ab 100644 --- a/gradle/libraries.gradle +++ b/gradle/libraries.gradle @@ -24,7 +24,7 @@ ext { weldVersion = '3.1.5.Final' jakartaWeldVersion = '4.0.1.SP1' - byteBuddyVersion = '1.12.5' + byteBuddyVersion = '1.12.7' agroalVersion = '1.9' From 157716095a2929f0ad9f743eb90b654c066c1370 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Sat, 15 Jan 2022 23:30:52 +0000 Subject: [PATCH 034/256] HHH-15002 Add integration test for the H2 Dialect change --- .../test/booleans/BooleanMappingTest.java | 61 +++++++++++++++++++ .../org/hibernate/test/booleans/Event.java | 38 ++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 hibernate-core/src/test/java/org/hibernate/test/booleans/BooleanMappingTest.java create mode 100644 hibernate-core/src/test/java/org/hibernate/test/booleans/Event.java diff --git a/hibernate-core/src/test/java/org/hibernate/test/booleans/BooleanMappingTest.java b/hibernate-core/src/test/java/org/hibernate/test/booleans/BooleanMappingTest.java new file mode 100644 index 000000000000..adf08a0f7efa --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/booleans/BooleanMappingTest.java @@ -0,0 +1,61 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.booleans; + +import java.util.List; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; +import org.junit.Test; + +import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; + +/** + * Useful to verify Boolean mappings; in particular we had a new + * error on recent versions of H2, so let's ensure this works + * on whatever version the testsuite is being run with. + */ +public class BooleanMappingTest extends BaseCoreFunctionalTestCase { + + @Test + @TestForIssue(jiraKey = "HHH-15002") + public void testFetchEager() { + doInHibernate( this::sessionFactory, s -> { + Event activeEvent = new Event(); + activeEvent.setActive( Boolean.TRUE ); + s.persist( activeEvent ); + + Event inactiveEvent = new Event(); + inactiveEvent.setActive( Boolean.FALSE ); + s.persist( inactiveEvent ); + } ); + + final List activeEvents = doInHibernate( this::sessionFactory, s -> { + return s.createQuery( "SELECT e FROM Event e WHERE e.active = true", Event.class ).getResultList(); + } ); + + assertNotNull( activeEvents ); + assertEquals( 1, activeEvents.size() ); + + final List allEvents = doInHibernate( this::sessionFactory, s -> { + return s.createQuery( "FROM Event", Event.class ).getResultList(); + } ); + + assertNotNull( allEvents ); + assertEquals( 2, allEvents.size() ); + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + Event.class, + }; + } + +} diff --git a/hibernate-core/src/test/java/org/hibernate/test/booleans/Event.java b/hibernate-core/src/test/java/org/hibernate/test/booleans/Event.java new file mode 100644 index 000000000000..37503f3e287a --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/booleans/Event.java @@ -0,0 +1,38 @@ +/* + * Hibernate, Relational Persistence for Idiomatic Java + * + * License: GNU Lesser General Public License (LGPL), version 2.1 or later. + * See the lgpl.txt file in the root directory or . + */ +package org.hibernate.test.booleans; + +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; + +@Entity +public class Event { + + @Id + @GeneratedValue + private Long id; + + private Boolean active; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Boolean getActive() { + return active; + } + + public void setActive(Boolean active) { + this.active = active; + } + +} From 30b0ad267e02654dcb6d7cd03d7c604aeb71c143 Mon Sep 17 00:00:00 2001 From: Sanne Grinovero Date: Tue, 4 Jan 2022 16:54:13 +0000 Subject: [PATCH 035/256] HHH-15033 Restrict JNDI lookups to "java" scheme --- .../org/hibernate/engine/jndi/JndiException.java | 10 ++++++++++ .../engine/jndi/internal/JndiServiceImpl.java | 12 ++++++++++++ 2 files changed, 22 insertions(+) diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jndi/JndiException.java b/hibernate-core/src/main/java/org/hibernate/engine/jndi/JndiException.java index 0d28b6632fb3..d18076e59698 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jndi/JndiException.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jndi/JndiException.java @@ -22,4 +22,14 @@ public class JndiException extends HibernateException { public JndiException(String message, Throwable cause) { super( message, cause ); } + + /** + * Constructs a JndiException + * + * @param message Message explaining the exception condition + */ + public JndiException(String message) { + super( message ); + } + } diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jndi/internal/JndiServiceImpl.java b/hibernate-core/src/main/java/org/hibernate/engine/jndi/internal/JndiServiceImpl.java index 48ae9156cc6f..001a52a8d5e5 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jndi/internal/JndiServiceImpl.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jndi/internal/JndiServiceImpl.java @@ -6,6 +6,8 @@ */ package org.hibernate.engine.jndi.internal; +import java.net.URI; +import java.net.URISyntaxException; import java.util.Hashtable; import java.util.Map; import java.util.Properties; @@ -114,6 +116,16 @@ private InitialContext buildInitialContext() { } private Name parseName(String jndiName, Context context) { + try { + final URI uri = new URI( jndiName ); + final String scheme = uri.getScheme(); + if ( scheme != null && (! "java".equals( scheme ) ) ) { + throw new JndiException( "JNDI lookups for scheme '" + scheme + "' are not allowed" ); + } + } + catch (URISyntaxException e) { + //Ok + } try { return context.getNameParser( "" ).parse( jndiName ); } From ca2b8cb2f39dc30a2d83a952d8d39486e6924f9c Mon Sep 17 00:00:00 2001 From: Christian Beikov Date: Mon, 17 Jan 2022 17:07:43 +0100 Subject: [PATCH 036/256] HHH-15032 Fix backwards incompatible SPI change that happened in 5.6.2 due to introducing SqlStringGenerationContext --- .../hql/spi/id/MultiTableBulkIdStrategy.java | 28 ++++++++++++++-- .../hibernate/tool/schema/spi/Exporter.java | 32 +++++++++++++++++-- 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java index 48553f3b128a..b9c6c95148cb 100644 --- a/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java +++ b/hibernate-core/src/main/java/org/hibernate/hql/spi/id/MultiTableBulkIdStrategy.java @@ -23,6 +23,28 @@ * @author Steve Ebersole */ public interface MultiTableBulkIdStrategy { + + /** + * Prepare the strategy. Called as the SessionFactory is being built. Intended patterns here include:
      + *
    • Adding tables to the passed Mappings, to be picked by by "schema management tools"
    • + *
    • Manually creating the tables immediately through the passed JDBC Connection access
    • + *
    + * @param jdbcServices The JdbcService object + * @param connectionAccess Access to the JDBC Connection + * @param metadata Access to the O/RM mapping information + * @param sessionFactoryOptions + * @deprecated Will be removed in favor of the variant accepting a {@link SqlStringGenerationContext} + * @see #prepare(JdbcServices, JdbcConnectionAccess, MetadataImplementor, SessionFactoryOptions, SqlStringGenerationContext) + */ + @Deprecated + default void prepare( + JdbcServices jdbcServices, + JdbcConnectionAccess connectionAccess, + MetadataImplementor metadata, + SessionFactoryOptions sessionFactoryOptions) { + throw new IllegalStateException("prepare() was not implemented!"); + } + /** * Prepare the strategy. Called as the SessionFactory is being built. Intended patterns here include: