Skip to content

Commit 09f3021

Browse files
committed
HHH-19708 add MultiTenancy class
in case the MultiTenantConnectionProvider needs to access e.g. the TenantSchemaMapper
1 parent 9107ed3 commit 09f3021

File tree

7 files changed

+94
-54
lines changed

7 files changed

+94
-54
lines changed

hibernate-core/src/main/java/org/hibernate/boot/internal/MetadataBuilderImpl.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
import org.hibernate.AnnotationException;
1212
import org.hibernate.HibernateException;
13+
import org.hibernate.context.spi.MultiTenancy;
1314
import org.hibernate.type.TimeZoneStorageStrategy;
1415
import org.hibernate.annotations.CacheConcurrencyStrategy;
1516
import org.hibernate.annotations.TimeZoneStorageType;
@@ -65,7 +66,6 @@
6566
import org.hibernate.dialect.Dialect;
6667
import org.hibernate.dialect.TimeZoneSupport;
6768
import org.hibernate.engine.config.spi.ConfigurationService;
68-
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl;
6969
import org.hibernate.engine.jdbc.spi.JdbcServices;
7070
import org.hibernate.internal.CoreLogging;
7171
import org.hibernate.internal.CoreMessageLogger;
@@ -651,7 +651,7 @@ public MetadataBuildingOptionsImpl(StandardServiceRegistry serviceRegistry) {
651651

652652
defaultTimezoneStorage = resolveTimeZoneStorageStrategy( configService );
653653
wrapperArrayHandling = resolveWrapperArrayHandling( configService );
654-
multiTenancyEnabled = JdbcEnvironmentImpl.isMultiTenancyEnabled( serviceRegistry );
654+
multiTenancyEnabled = MultiTenancy.isMultiTenancyEnabled( serviceRegistry );
655655

656656
xmlMappingEnabled = configService.getSetting(
657657
AvailableSettings.XML_MAPPING_ENABLED,

hibernate-core/src/main/java/org/hibernate/boot/internal/SessionFactoryOptionsBuilder.java

Lines changed: 5 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
import org.hibernate.LockOptions;
2929
import org.hibernate.SessionEventListener;
3030
import org.hibernate.SessionFactoryObserver;
31+
import org.hibernate.context.spi.MultiTenancy;
3132
import org.hibernate.context.spi.TenantSchemaMapper;
3233
import org.hibernate.metamodel.mapping.EntityMappingType;
3334
import org.hibernate.metamodel.spi.RuntimeModelCreationContext;
@@ -49,7 +50,6 @@
4950
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
5051
import org.hibernate.dialect.Dialect;
5152
import org.hibernate.engine.config.spi.ConfigurationService;
52-
import org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl;
5353
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
5454
import org.hibernate.engine.jdbc.spi.JdbcServices;
5555
import org.hibernate.id.uuid.LocalObjectUuidHelper;
@@ -74,7 +74,6 @@
7474
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableInsertStrategy;
7575
import org.hibernate.query.sqm.mutation.spi.SqmMultiTableMutationStrategy;
7676
import org.hibernate.query.sqm.sql.SqmTranslatorFactory;
77-
import org.hibernate.resource.beans.internal.Helper;
7877
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
7978
import org.hibernate.resource.jdbc.spi.StatementInspector;
8079
import org.hibernate.resource.transaction.spi.TransactionCoordinatorBuilder;
@@ -347,22 +346,9 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo
347346
initializeLazyStateOutsideTransactions =
348347
configurationService.getSetting( ENABLE_LAZY_LOAD_NO_TRANS, BOOLEAN, false );
349348

350-
multiTenancyEnabled = JdbcEnvironmentImpl.isMultiTenancyEnabled( serviceRegistry );
351-
currentTenantIdentifierResolver =
352-
strategySelector.resolveStrategy( CurrentTenantIdentifierResolver.class,
353-
settings.get( MULTI_TENANT_IDENTIFIER_RESOLVER ) );
354-
if ( currentTenantIdentifierResolver == null ) {
355-
currentTenantIdentifierResolver = Helper.getBean(
356-
Helper.getBeanContainer( serviceRegistry ),
357-
CurrentTenantIdentifierResolver.class,
358-
true,
359-
false,
360-
null
361-
);
362-
}
363-
tenantSchemaMapper =
364-
strategySelector.resolveStrategy( TenantSchemaMapper.class,
365-
settings.get( MULTI_TENANT_SCHEMA_MAPPER ) );
349+
multiTenancyEnabled = MultiTenancy.isMultiTenancyEnabled( serviceRegistry );
350+
currentTenantIdentifierResolver = MultiTenancy.getTenantIdentifierResolver( settings, serviceRegistry );
351+
tenantSchemaMapper = MultiTenancy.getTenantSchemaMapper( settings, serviceRegistry );
366352

367353
delayBatchFetchLoaderCreations =
368354
configurationService.getSetting( DELAY_ENTITY_LOADER_CREATIONS, BOOLEAN, true );
@@ -416,7 +402,7 @@ public SessionFactoryOptionsBuilder(StandardServiceRegistry serviceRegistry, Boo
416402
preferredSqlTypeCodeForArray = ConfigurationHelper.getPreferredSqlTypeCodeForArray( serviceRegistry );
417403
defaultTimeZoneStorageStrategy = context.getMetadataBuildingOptions().getDefaultTimeZoneStorage();
418404

419-
final RegionFactory regionFactory = serviceRegistry.getService( RegionFactory.class );
405+
final var regionFactory = serviceRegistry.getService( RegionFactory.class );
420406
if ( !(regionFactory instanceof NoCachingRegionFactory) ) {
421407
secondLevelCacheEnabled =
422408
configurationService.getSetting( USE_SECOND_LEVEL_CACHE, BOOLEAN, true );
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
/*
2+
* SPDX-License-Identifier: Apache-2.0
3+
* Copyright Red Hat Inc. and Hibernate Authors
4+
*/
5+
package org.hibernate.context.spi;
6+
7+
import org.hibernate.Incubating;
8+
import org.hibernate.boot.registry.StandardServiceRegistry;
9+
import org.hibernate.boot.registry.selector.spi.StrategySelector;
10+
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
11+
import org.hibernate.resource.beans.internal.Helper;
12+
import org.hibernate.service.ServiceRegistry;
13+
14+
import java.util.Map;
15+
16+
import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_IDENTIFIER_RESOLVER;
17+
import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_SCHEMA_MAPPER;
18+
19+
/**
20+
* Exposes useful strategy objects to user-written components, for example,
21+
* to a custom implementation of {@link MultiTenantConnectionProvider}.
22+
*
23+
* @since 7.1
24+
*
25+
* @author Gavin King
26+
*/
27+
@Incubating
28+
public class MultiTenancy {
29+
30+
public static boolean isMultiTenancyEnabled(ServiceRegistry serviceRegistry) {
31+
return serviceRegistry.getService( MultiTenantConnectionProvider.class ) != null;
32+
}
33+
34+
@SuppressWarnings("unchecked")
35+
public static CurrentTenantIdentifierResolver<Object> getTenantIdentifierResolver(
36+
Map<String,Object> settings, StandardServiceRegistry registry) {
37+
final var currentTenantIdentifierResolver =
38+
registry.requireService( StrategySelector.class )
39+
.resolveStrategy( CurrentTenantIdentifierResolver.class,
40+
settings.get( MULTI_TENANT_IDENTIFIER_RESOLVER ) );
41+
if ( currentTenantIdentifierResolver == null ) {
42+
return Helper.getBean(
43+
Helper.getBeanContainer( registry ),
44+
CurrentTenantIdentifierResolver.class,
45+
true,
46+
false,
47+
null
48+
);
49+
}
50+
else {
51+
return currentTenantIdentifierResolver;
52+
}
53+
}
54+
55+
@SuppressWarnings("unchecked")
56+
public static TenantSchemaMapper<Object> getTenantSchemaMapper(
57+
Map<String,Object> settings, StandardServiceRegistry registry) {
58+
final var tenantSchemaMapper =
59+
registry.requireService( StrategySelector.class )
60+
.resolveStrategy( TenantSchemaMapper.class,
61+
settings.get( MULTI_TENANT_SCHEMA_MAPPER ) );
62+
if ( tenantSchemaMapper == null ) {
63+
return Helper.getBean(
64+
Helper.getBeanContainer( registry ),
65+
TenantSchemaMapper.class,
66+
true,
67+
false,
68+
null
69+
);
70+
}
71+
return tenantSchemaMapper;
72+
}
73+
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
import static org.hibernate.cfg.JdbcSettings.URL;
4343
import static org.hibernate.cfg.JdbcSettings.USER;
4444
import static org.hibernate.cfg.SchemaToolingSettings.ENABLE_SYNONYMS;
45-
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.isMultiTenancyEnabled;
45+
import static org.hibernate.context.spi.MultiTenancy.isMultiTenancyEnabled;
4646
import static org.hibernate.internal.util.StringHelper.isBlank;
4747
import static org.hibernate.internal.util.StringHelper.nullIfBlank;
4848

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentImpl.java

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import org.hibernate.engine.config.spi.ConfigurationService;
1515
import org.hibernate.engine.config.spi.StandardConverters;
1616
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;
17-
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
1817
import org.hibernate.engine.jdbc.env.spi.ExtractedDatabaseMetaData;
1918
import org.hibernate.engine.jdbc.env.spi.IdentifierHelper;
2019
import org.hibernate.engine.jdbc.env.spi.IdentifierHelperBuilder;
@@ -27,7 +26,6 @@
2726
import org.hibernate.exception.internal.SQLStateConversionDelegate;
2827
import org.hibernate.exception.internal.StandardSQLExceptionConverter;
2928
import org.hibernate.exception.spi.SQLExceptionConversionDelegate;
30-
import org.hibernate.service.ServiceRegistry;
3129
import org.hibernate.service.spi.ServiceRegistryImplementor;
3230
import org.hibernate.sql.ast.SqlAstTranslatorFactory;
3331
import org.hibernate.sql.ast.spi.StandardSqlAstTranslatorFactory;
@@ -46,10 +44,6 @@
4644
public class JdbcEnvironmentImpl implements JdbcEnvironment {
4745
private static final Logger log = Logger.getLogger( JdbcEnvironmentImpl.class );
4846

49-
public static boolean isMultiTenancyEnabled(ServiceRegistry serviceRegistry) {
50-
return serviceRegistry.getService( MultiTenantConnectionProvider.class ) != null;
51-
}
52-
5347
private final Dialect dialect;
5448

5549
private final SqlAstTranslatorFactory sqlAstTranslatorFactory;

hibernate-core/src/main/java/org/hibernate/engine/jdbc/env/internal/JdbcEnvironmentInitiator.java

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
import static org.hibernate.cfg.JdbcSettings.DIALECT_DB_VERSION;
6868
import static org.hibernate.cfg.JdbcSettings.JAKARTA_HBM2DDL_DB_VERSION;
6969
import static org.hibernate.engine.config.spi.StandardConverters.BOOLEAN;
70-
import static org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentImpl.isMultiTenancyEnabled;
70+
import static org.hibernate.context.spi.MultiTenancy.isMultiTenancyEnabled;
7171
import static org.hibernate.internal.log.DeprecationLogger.DEPRECATION_LOGGER;
7272
import static org.hibernate.internal.util.NullnessHelper.coalesceSuppliedValues;
7373
import static org.hibernate.internal.util.StringHelper.isNotEmpty;
@@ -185,14 +185,12 @@ protected void logConnectionInfo(DatabaseConnectionInfo databaseConnectionInfo)
185185
}
186186

187187
private DatabaseConnectionInfo buildInfo(ServiceRegistryImplementor registry, JdbcEnvironment environment) {
188-
if ( isMultiTenancyEnabled( registry ) ) {
189-
return registry.requireService( MultiTenantConnectionProvider.class )
190-
.getDatabaseConnectionInfo( environment.getDialect() );
191-
}
192-
else {
193-
return registry.requireService( ConnectionProvider.class )
194-
.getDatabaseConnectionInfo( environment.getDialect(), environment.getExtractedDatabaseMetaData() );
195-
}
188+
return isMultiTenancyEnabled( registry )
189+
? registry.requireService( MultiTenantConnectionProvider.class )
190+
.getDatabaseConnectionInfo( environment.getDialect() )
191+
: registry.requireService( ConnectionProvider.class )
192+
.getDatabaseConnectionInfo( environment.getDialect(),
193+
environment.getExtractedDatabaseMetaData() );
196194
}
197195

198196
private DatabaseConnectionInfo buildInfo(Map<String, Object> configurationValues, JdbcEnvironment environment) {
@@ -453,32 +451,21 @@ private static void logDatabaseAndDriver(DatabaseMetaData dbmd) throws SQLExcept
453451

454452
private static boolean explicitDialectConfiguration(String explicitDatabaseName,
455453
Map<String, Object> configurationValues) {
456-
return isNotEmpty( explicitDatabaseName ) || isNotNullAndNotEmpty( configurationValues.get( DIALECT ) );
454+
return isNotEmpty( explicitDatabaseName )
455+
|| isNotNullAndNotEmpty( configurationValues.get( DIALECT ) );
457456
}
458457

459458
private static boolean isNotNullAndNotEmpty(Object object) {
460459
return object != null
461-
&& ( !(object instanceof String string) || !string.isEmpty() );
462-
}
463-
464-
private JdbcConnectionAccess buildJdbcConnectionAccess(ServiceRegistryImplementor registry) {
465-
if ( !isMultiTenancyEnabled( registry ) ) {
466-
return new ConnectionProviderJdbcConnectionAccess( registry.requireService( ConnectionProvider.class ) );
467-
}
468-
else {
469-
final MultiTenantConnectionProvider<?> multiTenantConnectionProvider =
470-
registry.getService( MultiTenantConnectionProvider.class );
471-
return new MultiTenantConnectionProviderJdbcConnectionAccess( multiTenantConnectionProvider );
472-
}
460+
&& !( object instanceof String string && string.isEmpty() );
473461
}
474462

475-
public static JdbcConnectionAccess buildBootstrapJdbcConnectionAccess(ServiceRegistryImplementor registry) {
463+
public static JdbcConnectionAccess buildJdbcConnectionAccess(ServiceRegistryImplementor registry) {
476464
if ( !isMultiTenancyEnabled( registry ) ) {
477465
return new ConnectionProviderJdbcConnectionAccess( registry.requireService( ConnectionProvider.class ) );
478466
}
479467
else {
480-
final MultiTenantConnectionProvider<?> multiTenantConnectionProvider =
481-
registry.getService( MultiTenantConnectionProvider.class );
468+
final var multiTenantConnectionProvider = registry.getService( MultiTenantConnectionProvider.class );
482469
return new MultiTenantConnectionProviderJdbcConnectionAccess( multiTenantConnectionProvider );
483470
}
484471
}

hibernate-core/src/main/java/org/hibernate/engine/jdbc/internal/JdbcServicesImpl.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ public JdbcEnvironment getJdbcEnvironment() {
5959

6060
@Override
6161
public JdbcConnectionAccess getBootstrapJdbcConnectionAccess() {
62-
return JdbcEnvironmentInitiator.buildBootstrapJdbcConnectionAccess( serviceRegistry );
62+
return JdbcEnvironmentInitiator.buildJdbcConnectionAccess( serviceRegistry );
6363
}
6464

6565
@Override

0 commit comments

Comments
 (0)