Skip to content

Commit 7702aa4

Browse files
authored
Merge pull request #48699 from yrodiere/i29269
Do not require a default datasource definition when using a MultiTenantConnectionProvider
2 parents c5d9f78 + 6dff09b commit 7702aa4

File tree

4 files changed

+27
-6
lines changed

4 files changed

+27
-6
lines changed

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/FastBootHibernatePersistenceProvider.java

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import io.quarkus.hibernate.orm.runtime.config.DatabaseOrmCompatibilityVersion;
3737
import io.quarkus.hibernate.orm.runtime.integration.HibernateOrmIntegrationRuntimeDescriptor;
3838
import io.quarkus.hibernate.orm.runtime.integration.HibernateOrmIntegrationRuntimeInitListener;
39+
import io.quarkus.hibernate.orm.runtime.migration.MultiTenancyStrategy;
3940
import io.quarkus.hibernate.orm.runtime.recording.PrevalidatedQuarkusMetadata;
4041
import io.quarkus.hibernate.orm.runtime.recording.RecordedState;
4142

@@ -222,7 +223,8 @@ private RuntimeSettings buildRuntimeSettings(String persistenceUnitName, Recorde
222223
Optional<String> dataSourceName = recordedState.getBuildTimeSettings().getSource().getDataSource();
223224
if (dataSourceName.isPresent()) {
224225
// Inject the datasource
225-
injectDataSource(persistenceUnitName, dataSourceName.get(), runtimeSettingsBuilder);
226+
injectDataSource(persistenceUnitName, dataSourceName.get(), recordedState.getMultiTenancyStrategy(),
227+
runtimeSettingsBuilder);
226228
}
227229

228230
// Inject runtime configuration if the persistence unit was defined by Quarkus configuration
@@ -397,8 +399,10 @@ private void verifyProperties(Map properties) {
397399
}
398400

399401
private static void injectDataSource(String persistenceUnitName, String dataSourceName,
402+
MultiTenancyStrategy multiTenancyStrategy,
400403
RuntimeSettings.Builder runtimeSettingsBuilder) {
401-
// first convert
404+
// Note: the counterpart of this code, but for multitenancy (injecting the connection provider),
405+
// can be found in io.quarkus.hibernate.orm.runtime.boot.FastBootMetadataBuilder.mergeSettings
402406

403407
if (runtimeSettingsBuilder.isConfigured(AvailableSettings.URL) ||
404408
runtimeSettingsBuilder.isConfigured(AvailableSettings.DATASOURCE) ||
@@ -410,6 +414,16 @@ private static void injectDataSource(String persistenceUnitName, String dataSour
410414
return;
411415
}
412416

417+
if (multiTenancyStrategy != null && multiTenancyStrategy != MultiTenancyStrategy.NONE
418+
&& multiTenancyStrategy != MultiTenancyStrategy.DISCRIMINATOR) {
419+
// Nothing to do: the datasource retrieval will be handled dynamically
420+
// by an implementation of TenantConnectionResolver -- for instance
421+
// io.quarkus.hibernate.orm.runtime.tenant.DataSourceTenantConnectionResolver.
422+
// In the case of database multi-tenancy, that connection resolver
423+
// might not even use the assigned datasource.
424+
return;
425+
}
426+
413427
DataSource dataSource;
414428
try {
415429
// ClientProxy.unwrap is necessary to trigger exceptions on inactive datasources

extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/boot/FastBootMetadataBuilder.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -248,6 +248,9 @@ private MergedSettings mergeSettings(QuarkusPersistenceUnitDefinition puDefiniti
248248

249249
if (multiTenancyStrategy != null && multiTenancyStrategy != MultiTenancyStrategy.NONE
250250
&& multiTenancyStrategy != MultiTenancyStrategy.DISCRIMINATOR) {
251+
// Note: the counterpart of this code, but for single-tenancy (injecting the datasource),
252+
// can be found in io.quarkus.hibernate.orm.runtime.FastBootHibernatePersistenceProvider.injectDataSource
253+
251254
// We need to initialize the multi tenant connection provider
252255
// on static init as it is used in MetadataBuildingOptionsImpl
253256
// to determine if multi-tenancy is enabled.

integration-tests/hibernate-orm-tenancy/connection-resolver-legacy-qualifiers/src/main/resources/application.properties

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ quarkus.hibernate-orm.multitenant=database
66
quarkus.hibernate-orm.dialect=MariaDB
77
quarkus.hibernate-orm.packages=io.quarkus.it.hibernate.multitenancy.fruit
88

9-
# We create datasources manually, so a lack of configuration doesn't mean Quarkus should step in with defaults.
10-
quarkus.datasource.devservices.enabled=false
9+
# We create datasources programmatically, so we don't need the default datasource.
10+
# This makes sure Quarkus won't create a default datasource in test/dev mode.
11+
# This also helps reproduce https://github.com/quarkusio/quarkus/issues/29269.
12+
quarkus.datasource.active=false
1113

1214
# Inventory persistence unit
1315
quarkus.hibernate-orm."inventory".schema-management.strategy=none

integration-tests/hibernate-orm-tenancy/connection-resolver/src/main/resources/application.properties

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,10 @@ quarkus.hibernate-orm.multitenant=database
66
quarkus.hibernate-orm.dialect=MariaDB
77
quarkus.hibernate-orm.packages=io.quarkus.it.hibernate.multitenancy.fruit
88

9-
# We create datasources manually, so a lack of configuration doesn't mean Quarkus should step in with defaults.
10-
quarkus.datasource.devservices.enabled=false
9+
# We create datasources programmatically, so we don't need the default datasource.
10+
# This makes sure Quarkus won't create a default datasource in test/dev mode.
11+
# This also helps reproduce https://github.com/quarkusio/quarkus/issues/29269.
12+
quarkus.datasource.active=false
1113

1214
# Inventory persistence unit
1315
quarkus.hibernate-orm."inventory".schema-management.strategy=none

0 commit comments

Comments
 (0)