diff --git a/hibernate-core/src/main/java/org/hibernate/cfg/MultiTenancySettings.java b/hibernate-core/src/main/java/org/hibernate/cfg/MultiTenancySettings.java
index 70e4a16d21ab..60a6b36684ec 100644
--- a/hibernate-core/src/main/java/org/hibernate/cfg/MultiTenancySettings.java
+++ b/hibernate-core/src/main/java/org/hibernate/cfg/MultiTenancySettings.java
@@ -13,8 +13,14 @@
public interface MultiTenancySettings {
/**
- * Specifies a {@link MultiTenantConnectionProvider}
- * to use. Since {@code MultiTenantConnectionProvider} is also a service, it may be configured
+ * Specifies a {@link MultiTenantConnectionProvider} to use, either:
+ *
+ *
an instance of {@code MultiTenantConnectionProvider},
+ *
a {@link Class} representing a class that implements {@code MultiTenantConnectionProvider}, or
+ *
the name of a class that implements {@code MultiTenantConnectionProvider}.
+ *
+ *
+ * Since {@code MultiTenantConnectionProvider} is also a service, it may be configured
* directly via the {@link org.hibernate.boot.registry.StandardServiceRegistryBuilder}.
*
* @since 4.1
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java
index 4d9fb06c5fbd..5c355ed2b989 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/ConnectionProviderInitiator.java
@@ -6,7 +6,6 @@
import java.lang.reflect.InvocationTargetException;
import java.sql.Connection;
-import java.util.Collection;
import java.util.HashSet;
import java.util.Map;
import java.util.Properties;
@@ -24,6 +23,7 @@
import org.hibernate.resource.beans.internal.Helper;
import org.hibernate.service.spi.ServiceRegistryImplementor;
+import static java.lang.Integer.parseInt;
import static java.sql.Connection.TRANSACTION_NONE;
import static java.sql.Connection.TRANSACTION_READ_COMMITTED;
import static java.sql.Connection.TRANSACTION_READ_UNCOMMITTED;
@@ -90,8 +90,8 @@ public ConnectionProvider initiateService(
return null;
}
- final BeanContainer beanContainer = Helper.getBeanContainer( registry );
- final StrategySelector strategySelector = registry.requireService( StrategySelector.class );
+ final var beanContainer = Helper.getBeanContainer( registry );
+ final var strategySelector = registry.requireService( StrategySelector.class );
final Object explicitSetting = configurationValues.get( CONNECTION_PROVIDER );
if ( explicitSetting != null ) {
// if we are explicitly supplied a ConnectionProvider to use (in some form) -> use it..
@@ -118,17 +118,15 @@ private static Class extends ConnectionProvider> connectionProviderClass(Class
throw new ConnectionProviderConfigurationException( "Class '" + providerClass.getName()
+ "' does not implement 'ConnectionProvider'" );
}
- @SuppressWarnings("unchecked")
- final Class extends ConnectionProvider> connectionProviderClass =
- (Class extends ConnectionProvider>) providerClass;
+ @SuppressWarnings("unchecked") // Safe, we just checked
+ final var connectionProviderClass = (Class extends ConnectionProvider>) providerClass;
return connectionProviderClass;
}
private ConnectionProvider instantiateNamedConnectionProvider(
String providerName, StrategySelector strategySelector, BeanContainer beanContainer) {
LOG.instantiatingExplicitConnectionProvider( providerName );
- final Class extends ConnectionProvider> providerClass =
- strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
+ final var providerClass = strategySelector.selectStrategyImplementor( ConnectionProvider.class, providerName );
try {
return instantiateExplicitConnectionProvider( providerClass, beanContainer );
}
@@ -143,8 +141,7 @@ private ConnectionProvider instantiateConnectionProvider(
return new DataSourceConnectionProvider();
}
- final Class extends ConnectionProvider> singleRegisteredProvider =
- getSingleRegisteredProvider( strategySelector );
+ final var singleRegisteredProvider = getSingleRegisteredProvider( strategySelector );
if ( singleRegisteredProvider != null ) {
try {
return singleRegisteredProvider.getConstructor().newInstance();
@@ -188,8 +185,7 @@ private ConnectionProvider noAppropriateConnectionProvider() {
}
private Class extends ConnectionProvider> getSingleRegisteredProvider(StrategySelector strategySelector) {
- final Collection> implementors =
- strategySelector.getRegisteredStrategyImplementors( ConnectionProvider.class );
+ final var implementors = strategySelector.getRegisteredStrategyImplementors( ConnectionProvider.class );
return implementors != null && implementors.size() == 1
? implementors.iterator().next()
: null;
@@ -245,7 +241,7 @@ private static ConnectionProvider instantiateProvider(StrategySelector selector,
* @return The connection properties.
*/
public static Properties getConnectionProperties(Map properties) {
- final Properties result = new Properties();
+ final var result = new Properties();
for ( var entry : properties.entrySet() ) {
if ( entry.getValue() instanceof String value ) {
final String key = entry.getKey();
@@ -343,7 +339,7 @@ else if ( ISOLATION_VALUE_MAP.containsKey( string ) ) {
else {
// it could be a String representation of the isolation numeric value
try {
- final int isolationLevel = Integer.parseInt( string );
+ final int isolationLevel = parseInt( string );
checkIsolationLevel( isolationLevel );
return isolationLevel;
}
@@ -397,8 +393,8 @@ public static String toIsolationNiceName(Integer isolation) {
public static String extractSetting(Map settings, String... names) {
for ( String name : names ) {
- if ( settings.containsKey(name) ) {
- return (String) settings.get(name);
+ if ( settings.containsKey( name ) ) {
+ return (String) settings.get( name );
}
}
return null;
diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/MultiTenantConnectionProviderInitiator.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/MultiTenantConnectionProviderInitiator.java
index d0b194aa2fc3..e3dd902d7b27 100644
--- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/MultiTenantConnectionProviderInitiator.java
+++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/connections/internal/MultiTenantConnectionProviderInitiator.java
@@ -9,14 +9,15 @@
import org.hibernate.boot.registry.StandardServiceInitiator;
import org.hibernate.boot.registry.classloading.spi.ClassLoaderService;
import org.hibernate.boot.registry.classloading.spi.ClassLoadingException;
-import org.hibernate.cfg.AvailableSettings;
+import org.hibernate.cfg.JdbcSettings;
+import org.hibernate.engine.jdbc.connections.spi.ConnectionProviderConfigurationException;
import org.hibernate.engine.jdbc.connections.spi.DataSourceBasedMultiTenantConnectionProviderImpl;
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
import org.hibernate.resource.beans.internal.Helper;
import org.hibernate.service.spi.ServiceException;
import org.hibernate.service.spi.ServiceRegistryImplementor;
-import org.jboss.logging.Logger;
+import static org.hibernate.cfg.MultiTenancySettings.MULTI_TENANT_CONNECTION_PROVIDER;
/**
* A service initiator for the {@link MultiTenantConnectionProvider} service.
@@ -24,7 +25,6 @@
* @author Steve Ebersole
*/
public class MultiTenantConnectionProviderInitiator implements StandardServiceInitiator> {
- private static final Logger log = Logger.getLogger( MultiTenantConnectionProviderInitiator.class );
/**
* Singleton access
@@ -39,7 +39,7 @@ public Class> getServiceInitiated() {
@Override
public MultiTenantConnectionProvider> initiateService(Map configurationValues, ServiceRegistryImplementor registry) {
- if ( !configurationValues.containsKey( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER ) ) {
+ if ( !configurationValues.containsKey( MULTI_TENANT_CONNECTION_PROVIDER ) ) {
return Helper.getBean(
Helper.getBeanContainer( registry ),
MultiTenantConnectionProvider.class,
@@ -49,46 +49,48 @@ public MultiTenantConnectionProvider> initiateService(Map conf
);
}
- final Object configValue = configurationValues.get( AvailableSettings.MULTI_TENANT_CONNECTION_PROVIDER );
+ final Object configValue = configurationValues.get( MULTI_TENANT_CONNECTION_PROVIDER );
if ( configValue == null ) {
- // if they also specified the data source *name*, then lets assume they want
+ // if they also specified the data source *name*, then let's assume they want
// DataSourceBasedMultiTenantConnectionProviderImpl
- final Object dataSourceConfigValue = configurationValues.get( AvailableSettings.DATASOURCE );
- if ( dataSourceConfigValue instanceof String ) {
- return new DataSourceBasedMultiTenantConnectionProviderImpl<>();
- }
-
- return null;
+ final Object dataSourceConfigValue = configurationValues.get( JdbcSettings.DATASOURCE );
+ return dataSourceConfigValue instanceof String
+ ? new DataSourceBasedMultiTenantConnectionProviderImpl<>()
+ : null;
}
-
- if ( configValue instanceof MultiTenantConnectionProvider> multiTenantConnectionProvider ) {
+ else if ( configValue instanceof MultiTenantConnectionProvider> multiTenantConnectionProvider ) {
return multiTenantConnectionProvider;
}
else {
- final Class> implClass;
- if ( configValue instanceof Class ) {
- @SuppressWarnings("unchecked")
- Class> clazz = (Class>) configValue;
- implClass = clazz;
+ final var providerClass = providerClass( registry, configValue );
+ try {
+ return providerClass.newInstance();
}
- else {
- final String className = configValue.toString();
- final ClassLoaderService classLoaderService = registry.requireService( ClassLoaderService.class );
- try {
- implClass = classLoaderService.classForName( className );
- }
- catch (ClassLoadingException cle) {
- log.warn( "Unable to locate specified class [" + className + "]", cle );
- throw new ServiceException( "Unable to locate specified multi-tenant connection provider [" + className + "]" );
- }
+ catch (Exception e) {
+ throw new ServiceException( "Unable to instantiate specified multi-tenant connection provider [" + providerClass.getName() + "]", e );
}
+ }
+ }
+ private static Class extends MultiTenantConnectionProvider>> providerClass(
+ ServiceRegistryImplementor registry, Object configValue) {
+ if ( configValue instanceof Class> configType ) {
+ if ( !MultiTenantConnectionProvider.class.isAssignableFrom( configType ) ) {
+ throw new ConnectionProviderConfigurationException( "Class '" + configType.getName()
+ + "' does not implement 'MultiTenantConnectionProvider'" );
+ }
+ @SuppressWarnings("unchecked") // Safe, we just checked
+ final var providerClass = (Class extends MultiTenantConnectionProvider>>) configType;
+ return providerClass;
+ }
+ else {
+ final String className = configValue.toString();
+ final var classLoaderService = registry.requireService( ClassLoaderService.class );
try {
- return implClass.newInstance();
+ return classLoaderService.classForName( className );
}
- catch (Exception e) {
- log.warn( "Unable to instantiate specified class [" + implClass.getName() + "]", e );
- throw new ServiceException( "Unable to instantiate specified multi-tenant connection provider [" + implClass.getName() + "]" );
+ catch (ClassLoadingException cle) {
+ throw new ServiceException( "Unable to locate specified multi-tenant connection provider [" + className + "]", cle );
}
}
}
diff --git a/hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java b/hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java
index 3ce06f230a0f..9f9a881aed7d 100644
--- a/hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java
+++ b/hibernate-core/src/main/java/org/hibernate/type/BasicTypeRegistry.java
@@ -12,16 +12,16 @@
import org.hibernate.HibernateException;
import org.hibernate.Internal;
import org.hibernate.MappingException;
+import org.hibernate.boot.spi.BootstrapContext;
import org.hibernate.internal.CoreLogging;
import org.hibernate.internal.CoreMessageLogger;
-import org.hibernate.internal.util.StringHelper;
-import org.hibernate.internal.util.collections.CollectionHelper;
-import org.hibernate.type.descriptor.converter.spi.BasicValueConverter;
import org.hibernate.type.descriptor.java.BasicPluralJavaType;
import org.hibernate.type.descriptor.java.ImmutableMutabilityPlan;
import org.hibernate.type.descriptor.java.JavaType;
+import org.hibernate.type.descriptor.java.spi.JavaTypeRegistry;
import org.hibernate.type.descriptor.jdbc.ArrayJdbcType;
import org.hibernate.type.descriptor.jdbc.JdbcType;
+import org.hibernate.type.descriptor.jdbc.spi.JdbcTypeRegistry;
import org.hibernate.type.internal.BasicTypeImpl;
import org.hibernate.type.internal.ConvertedBasicTypeImpl;
import org.hibernate.type.internal.CustomMutabilityConvertedBasicTypeImpl;
@@ -30,6 +30,9 @@
import org.hibernate.type.spi.TypeConfiguration;
import org.hibernate.usertype.UserType;
+import static org.hibernate.internal.util.StringHelper.isNotEmpty;
+import static org.hibernate.internal.util.collections.CollectionHelper.isEmpty;
+
/**
* A registry of {@link BasicType} instances
*
@@ -53,8 +56,16 @@ public BasicTypeRegistry(TypeConfiguration typeConfiguration){
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Access
+ private JavaTypeRegistry getJavaTypeRegistry() {
+ return typeConfiguration.getJavaTypeRegistry();
+ }
+
+ private JdbcTypeRegistry getJdbcTypeRegistry() {
+ return typeConfiguration.getJdbcTypeRegistry();
+ }
+
public BasicType getRegisteredType(String key) {
- BasicType> basicType = typesByName.get( key );
+ var basicType = typesByName.get( key );
if ( basicType == null ) {
basicType = resolveTypeReference( key );
}
@@ -63,12 +74,12 @@ public BasicType getRegisteredType(String key) {
}
private BasicType> resolveTypeReference(String name) {
- final BasicTypeReference> typeReference = typeReferencesByName.get( name );
+ final var typeReference = typeReferencesByName.get( name );
if ( typeReference == null ) {
return null;
}
else if ( !name.equals( typeReference.getName() ) ) {
- final BasicType> basicType = typesByName.get( typeReference.getName() );
+ final var basicType = typesByName.get( typeReference.getName() );
if ( basicType != null ) {
return basicType;
}
@@ -78,13 +89,9 @@ else if ( !name.equals( typeReference.getName() ) ) {
}
private BasicType> createBasicType(String name, BasicTypeReference> typeReference) {
- final JavaType