From a1a0ecd05287ac96f159e2f16feaeff9da64bab3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yoann=20Rodi=C3=A8re?= Date: Thu, 16 May 2024 12:36:04 +0200 Subject: [PATCH] Deprecate quarkus.hibernate-orm.multitenant-schema-datasource There are no tests involving this configuration property. `quarkus.hibernate-orm.datasource` serves the exact same purpose and is more standardized and better handled (e.g. in Dev UI). See https://github.com/quarkusio/quarkus/issues/18564 --- docs/src/main/asciidoc/hibernate-orm.adoc | 2 +- .../HibernateOrmConfigPersistenceUnit.java | 3 +++ .../orm/deployment/HibernateOrmProcessor.java | 22 +++++++++++++++---- .../orm/runtime/HibernateOrmRecorder.java | 5 ++--- .../DataSourceTenantConnectionResolver.java | 21 +++++------------- 5 files changed, 30 insertions(+), 23 deletions(-) diff --git a/docs/src/main/asciidoc/hibernate-orm.adoc b/docs/src/main/asciidoc/hibernate-orm.adoc index def7a4f8bf355..febded3b4cb11 100644 --- a/docs/src/main/asciidoc/hibernate-orm.adoc +++ b/docs/src/main/asciidoc/hibernate-orm.adoc @@ -1132,7 +1132,7 @@ quarkus.hibernate-orm.database.generation=none # Enable SCHEMA approach and use default datasource quarkus.hibernate-orm.multitenant=SCHEMA # You could use a non-default datasource by using the following setting -# quarkus.hibernate-orm.multitenant-schema-datasource=other +# quarkus.hibernate-orm.datasource=other # The default data source used for all tenant schemas quarkus.datasource.db-kind=postgresql diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfigPersistenceUnit.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfigPersistenceUnit.java index bdf64462f2836..1f29cbd83ca83 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfigPersistenceUnit.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmConfigPersistenceUnit.java @@ -229,7 +229,10 @@ public interface HibernateOrmConfigPersistenceUnit { /** * Defines the name of the datasource to use in case of SCHEMA approach. The datasource of the persistence unit will be used * if not set. + * + * @deprecated Use {@link #datasource()} instead. */ + @Deprecated @WithConverter(TrimmedStringConverter.class) Optional multitenantSchemaDatasource(); diff --git a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java index e4fa1e23973d0..656443066024a 100644 --- a/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java +++ b/extensions/hibernate-orm/deployment/src/main/java/io/quarkus/hibernate/orm/deployment/HibernateOrmProcessor.java @@ -670,12 +670,27 @@ public void multitenancy(HibernateOrmRecorder recorder, boolean multitenancyEnabled = false; for (PersistenceUnitDescriptorBuildItem persistenceUnitDescriptor : persistenceUnitDescriptors) { - switch (persistenceUnitDescriptor.getConfig().getMultiTenancyStrategy()) { + String persistenceUnitConfigName = persistenceUnitDescriptor.getConfigurationName(); + var multitenancyStrategy = persistenceUnitDescriptor.getConfig().getMultiTenancyStrategy(); + switch (multitenancyStrategy) { case NONE -> { } case DISCRIMINATOR -> multitenancyEnabled = true; case DATABASE, SCHEMA -> { multitenancyEnabled = true; + + String multiTenancySchemaDataSource = persistenceUnitDescriptor.getMultiTenancySchemaDataSource(); + Optional datasource; + if (multitenancyStrategy == MultiTenancyStrategy.SCHEMA && multiTenancySchemaDataSource != null) { + LOG.warnf("Configuration property '%1$s' is deprecated. Use '%2$s' instead.", + HibernateOrmRuntimeConfig.puPropertyKey(persistenceUnitConfigName, + "multitenant-schema-datasource"), + HibernateOrmRuntimeConfig.puPropertyKey(persistenceUnitConfigName, "datasource")); + datasource = Optional.of(multiTenancySchemaDataSource); + } else { + datasource = persistenceUnitDescriptor.getConfig().getDataSource(); + } + ExtendedBeanConfigurator configurator = SyntheticBeanBuildItem .configure(DataSourceTenantConnectionResolver.class) .scope(ApplicationScoped.class) @@ -685,9 +700,8 @@ public void multitenancy(HibernateOrmRecorder recorder, .unremovable() .supplier(recorder.dataSourceTenantConnectionResolver( persistenceUnitDescriptor.getPersistenceUnitName(), - persistenceUnitDescriptor.getConfig().getDataSource(), - persistenceUnitDescriptor.getConfig().getMultiTenancyStrategy(), - persistenceUnitDescriptor.getMultiTenancySchemaDataSource())); + datasource, + persistenceUnitDescriptor.getConfig().getMultiTenancyStrategy())); if (PersistenceUnitUtil.isDefaultPersistenceUnit(persistenceUnitDescriptor.getPersistenceUnitName())) { configurator.addQualifier(Default.class); diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java index 5050d7e5c648e..01259ea60f49c 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/HibernateOrmRecorder.java @@ -83,12 +83,11 @@ public void created(BeanContainer beanContainer) { public Supplier dataSourceTenantConnectionResolver(String persistenceUnitName, Optional dataSourceName, - MultiTenancyStrategy multiTenancyStrategy, String multiTenancySchemaDataSourceName) { + MultiTenancyStrategy multiTenancyStrategy) { return new Supplier() { @Override public DataSourceTenantConnectionResolver get() { - return new DataSourceTenantConnectionResolver(persistenceUnitName, dataSourceName, multiTenancyStrategy, - multiTenancySchemaDataSourceName); + return new DataSourceTenantConnectionResolver(persistenceUnitName, dataSourceName, multiTenancyStrategy); } }; } diff --git a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java index 0d2c0df3d6f71..4bc6dbed953d0 100644 --- a/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java +++ b/extensions/hibernate-orm/runtime/src/main/java/io/quarkus/hibernate/orm/runtime/tenant/DataSourceTenantConnectionResolver.java @@ -34,17 +34,14 @@ public class DataSourceTenantConnectionResolver implements TenantConnectionResol private MultiTenancyStrategy multiTenancyStrategy; - private String multiTenancySchemaDataSourceName; - public DataSourceTenantConnectionResolver() { } public DataSourceTenantConnectionResolver(String persistenceUnitName, Optional dataSourceName, - MultiTenancyStrategy multiTenancyStrategy, String multiTenancySchemaDataSourceName) { + MultiTenancyStrategy multiTenancyStrategy) { this.persistenceUnitName = persistenceUnitName; this.dataSourceName = dataSourceName; this.multiTenancyStrategy = multiTenancyStrategy; - this.multiTenancySchemaDataSourceName = multiTenancySchemaDataSourceName; } @Override @@ -52,8 +49,7 @@ public ConnectionProvider resolve(String tenantId) { LOG.debugv("resolve((persistenceUnitName={0}, tenantIdentifier={1})", persistenceUnitName, tenantId); LOG.debugv("multitenancy strategy: {0}", multiTenancyStrategy); - AgroalDataSource dataSource = tenantDataSource(dataSourceName, tenantId, multiTenancyStrategy, - multiTenancySchemaDataSourceName); + AgroalDataSource dataSource = tenantDataSource(dataSourceName, tenantId, multiTenancyStrategy); if (dataSource == null) { throw new IllegalStateException( String.format(Locale.ROOT, "No instance of datasource found for persistence unit '%1$s' and tenant '%2$s'", @@ -67,17 +63,12 @@ public ConnectionProvider resolve(String tenantId) { } private static AgroalDataSource tenantDataSource(Optional dataSourceName, String tenantId, - MultiTenancyStrategy strategy, String multiTenancySchemaDataSourceName) { + MultiTenancyStrategy strategy) { return switch (strategy) { case DATABASE -> Arc.container().instance(AgroalDataSource.class, new DataSource.DataSourceLiteral(tenantId)).get(); - case SCHEMA -> { - if (multiTenancySchemaDataSourceName == null) { - // The datasource name should always be present when using a multi-tenancy other than DATABASE; - // we perform checks in HibernateOrmProcessor during the build. - yield getDataSource(dataSourceName.get()); - } - yield getDataSource(multiTenancySchemaDataSourceName); - } + // The datasource name should always be present when using a multi-tenancy other than DATABASE; + // we perform checks in HibernateOrmProcessor during the build. + case SCHEMA -> getDataSource(dataSourceName.get()); default -> throw new IllegalStateException("Unexpected multitenancy strategy: " + strategy); }; }