diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java index 1e0c884eafe64..8ea8b0eeec669 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java @@ -36,6 +36,7 @@ import io.quarkus.hibernate.orm.runtime.config.DatabaseOrmCompatibilityVersion; import io.quarkus.hibernate.orm.runtime.integration.HibernateOrmIntegrationRuntimeDescriptor; import io.quarkus.hibernate.orm.runtime.integration.HibernateOrmIntegrationRuntimeInitListener; +import io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy; import io.quarkus.hibernate.orm.runtime.recording.PrevalidatedQuarkusMetadata; import io.quarkus.hibernate.orm.runtime.recording.RecordedState; @@ -222,7 +223,8 @@ private RuntimeSettings buildRuntimeSettings(String persistenceUnitName, Recorde Optional dataSourceName = recordedState.getBuildTimeSettings().getSource().getDataSource(); if (dataSourceName.isPresent()) { // Inject the datasource - injectDataSource(persistenceUnitName, dataSourceName.get(), runtimeSettingsBuilder); + injectDataSource(persistenceUnitName, dataSourceName.get(), recordedState.getMultiTenancyStrategy(), + runtimeSettingsBuilder); } // Inject runtime configuration if the persistence unit was defined by Quarkus configuration @@ -397,8 +399,10 @@ private void verifyProperties(Map properties) { } private static void injectDataSource(String persistenceUnitName, String dataSourceName, + MultiTenancyStrategy multiTenancyStrategy, RuntimeSettings.Builder runtimeSettingsBuilder) { - // first convert + // Note: the counterpart of this code, but for multitenancy (injecting the connection provider), + // can be found in io.quarkus.hibernate.orm.runtime.boot.FastBootMetadataBuilder.mergeSettings if (runtimeSettingsBuilder.isConfigured(AvailableSettings.URL) || runtimeSettingsBuilder.isConfigured(AvailableSettings.DATASOURCE) || @@ -410,6 +414,16 @@ private static void injectDataSource(String persistenceUnitName, String dataSour return; } + if (multiTenancyStrategy != null && multiTenancyStrategy != MultiTenancyStrategy.NONE + && multiTenancyStrategy != MultiTenancyStrategy.DISCRIMINATOR) { + // Nothing to do: the datasource retrieval will be handled dynamically + // by an implementation of TenantConnectionResolver -- for instance + // io.quarkus.hibernate.orm.runtime.tenant.DataSourceTenantConnectionResolver. + // In the case of database multi-tenancy, that connection resolver + // might not even use the assigned datasource. + return; + } + DataSource dataSource; try { // ClientProxy.unwrap is necessary to trigger exceptions on inactive datasources diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java index 48a413ca7782f..ea5c2a40032e1 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java @@ -248,6 +248,9 @@ private MergedSettings mergeSettings(QuarkusPersistenceUnitDefinition puDefiniti if (multiTenancyStrategy != null && multiTenancyStrategy != MultiTenancyStrategy.NONE && multiTenancyStrategy != MultiTenancyStrategy.DISCRIMINATOR) { + // Note: the counterpart of this code, but for single-tenancy (injecting the datasource), + // can be found in io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.injectDataSource + // We need to initialize the multi tenant connection provider // on static init as it is used in MetadataBuildingOptionsImpl // to determine if multi-tenancy is enabled. diff --git a/integration-tests/hibernate-orm-tenancy/connection-resolver-legacy-qualifiers/src/main/resources/application.properties b/integration-tests/hibernate-orm-tenancy/connection-resolver-legacy-qualifiers/src/main/resources/application.properties index 8d5eb9a79f6df..491c781c06ff8 100644 --- a/integration-tests/hibernate-orm-tenancy/connection-resolver-legacy-qualifiers/src/main/resources/application.properties +++ b/integration-tests/hibernate-orm-tenancy/connection-resolver-legacy-qualifiers/src/main/resources/application.properties @@ -6,8 +6,10 @@ quarkus.hibernate-orm.multitenant=database quarkus.hibernate-orm.dialect=MariaDB quarkus.hibernate-orm.packages=io.quarkus.it.hibernate.multitenancy.fruit -# We create datasources manually, so a lack of configuration doesn't mean Quarkus should step in with defaults. -quarkus.datasource.devservices.enabled=false +# We create datasources programmatically, so we don't need the default datasource. +# This makes sure Quarkus won't create a default datasource in test/dev mode. +# This also helps reproduce https://github.com/quarkusio/quarkus/issues/29269. +quarkus.datasource.active=false # Inventory persistence unit quarkus.hibernate-orm."inventory".schema-management.strategy=none diff --git a/integration-tests/hibernate-orm-tenancy/connection-resolver/src/main/resources/application.properties b/integration-tests/hibernate-orm-tenancy/connection-resolver/src/main/resources/application.properties index 8d5eb9a79f6df..491c781c06ff8 100644 --- a/integration-tests/hibernate-orm-tenancy/connection-resolver/src/main/resources/application.properties +++ b/integration-tests/hibernate-orm-tenancy/connection-resolver/src/main/resources/application.properties @@ -6,8 +6,10 @@ quarkus.hibernate-orm.multitenant=database quarkus.hibernate-orm.dialect=MariaDB quarkus.hibernate-orm.packages=io.quarkus.it.hibernate.multitenancy.fruit -# We create datasources manually, so a lack of configuration doesn't mean Quarkus should step in with defaults. -quarkus.datasource.devservices.enabled=false +# We create datasources programmatically, so we don't need the default datasource. +# This makes sure Quarkus won't create a default datasource in test/dev mode. +# This also helps reproduce https://github.com/quarkusio/quarkus/issues/29269. +quarkus.datasource.active=false # Inventory persistence unit quarkus.hibernate-orm."inventory".schema-management.strategy=none