Explicit support for Hibernate Integrators on LocalSessionFactoryBean
Issue: SPR-16828
This commit is contained in:
parent
b0ece0e967
commit
b6d95567e8
|
|
@ -30,6 +30,8 @@ import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder;
|
||||||
import org.hibernate.cfg.Configuration;
|
import org.hibernate.cfg.Configuration;
|
||||||
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
|
import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
|
||||||
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
|
import org.hibernate.engine.jdbc.connections.spi.MultiTenantConnectionProvider;
|
||||||
|
import org.hibernate.integrator.spi.Integrator;
|
||||||
|
import org.hibernate.service.ServiceRegistry;
|
||||||
|
|
||||||
import org.springframework.beans.factory.DisposableBean;
|
import org.springframework.beans.factory.DisposableBean;
|
||||||
import org.springframework.beans.factory.FactoryBean;
|
import org.springframework.beans.factory.FactoryBean;
|
||||||
|
|
@ -44,15 +46,13 @@ import org.springframework.core.io.support.ResourcePatternUtils;
|
||||||
import org.springframework.core.task.AsyncTaskExecutor;
|
import org.springframework.core.task.AsyncTaskExecutor;
|
||||||
import org.springframework.core.type.filter.TypeFilter;
|
import org.springframework.core.type.filter.TypeFilter;
|
||||||
import org.springframework.lang.Nullable;
|
import org.springframework.lang.Nullable;
|
||||||
import org.springframework.util.Assert;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* {@link FactoryBean} that creates a Hibernate
|
* {@link FactoryBean} that creates a Hibernate {@link SessionFactory}. This is the usual
|
||||||
* {@link SessionFactory}. This is the usual way to set up a shared
|
* way to set up a shared Hibernate SessionFactory in a Spring application context; the
|
||||||
* Hibernate SessionFactory in a Spring application context; the SessionFactory can
|
* SessionFactory can then be passed to data access objects via dependency injection.
|
||||||
* then be passed to Hibernate-based data access objects via dependency injection.
|
|
||||||
*
|
*
|
||||||
* <p>Compatible with Hibernate 5.0/5.1 as well as 5.2, as of Spring 4.3.
|
* <p>Compatible with Hibernate 5.0/5.1 as well as 5.2/5.3, as of Spring 5.1.
|
||||||
*
|
*
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @since 4.2
|
* @since 4.2
|
||||||
|
|
@ -120,6 +120,9 @@ public class LocalSessionFactoryBean extends HibernateExceptionTranslator
|
||||||
@Nullable
|
@Nullable
|
||||||
private AsyncTaskExecutor bootstrapExecutor;
|
private AsyncTaskExecutor bootstrapExecutor;
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private Integrator[] hibernateIntegrators;
|
||||||
|
|
||||||
private boolean metadataSourcesAccessed = false;
|
private boolean metadataSourcesAccessed = false;
|
||||||
|
|
||||||
@Nullable
|
@Nullable
|
||||||
|
|
@ -358,14 +361,28 @@ public class LocalSessionFactoryBean extends HibernateExceptionTranslator
|
||||||
this.bootstrapExecutor = bootstrapExecutor;
|
this.bootstrapExecutor = bootstrapExecutor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Specify one or more Hibernate {@link Integrator} implementations to apply.
|
||||||
|
* <p>This will only be applied for an internally built {@link MetadataSources}
|
||||||
|
* instance. {@link #setMetadataSources} effectively overrides such settings,
|
||||||
|
* with integrators to be applied to the externally built {@link MetadataSources}.
|
||||||
|
* @since 5.1
|
||||||
|
* @see #setMetadataSources
|
||||||
|
* @see BootstrapServiceRegistryBuilder#applyIntegrator
|
||||||
|
*/
|
||||||
|
public void setHibernateIntegrators(Integrator... hibernateIntegrators) {
|
||||||
|
this.hibernateIntegrators = hibernateIntegrators;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Specify a Hibernate {@link MetadataSources} service to use (e.g. reusing an
|
* Specify a Hibernate {@link MetadataSources} service to use (e.g. reusing an
|
||||||
* existing one), potentially populated with a custom Hibernate bootstrap
|
* existing one), potentially populated with a custom Hibernate bootstrap
|
||||||
* {@link org.hibernate.service.ServiceRegistry} as well.
|
* {@link org.hibernate.service.ServiceRegistry} as well.
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
|
* @see MetadataSources#MetadataSources(ServiceRegistry)
|
||||||
|
* @see BootstrapServiceRegistryBuilder#build()
|
||||||
*/
|
*/
|
||||||
public void setMetadataSources(MetadataSources metadataSources) {
|
public void setMetadataSources(MetadataSources metadataSources) {
|
||||||
Assert.notNull(metadataSources, "MetadataSources must not be null");
|
|
||||||
this.metadataSourcesAccessed = true;
|
this.metadataSourcesAccessed = true;
|
||||||
this.metadataSources = metadataSources;
|
this.metadataSources = metadataSources;
|
||||||
}
|
}
|
||||||
|
|
@ -385,6 +402,11 @@ public class LocalSessionFactoryBean extends HibernateExceptionTranslator
|
||||||
if (this.resourcePatternResolver != null) {
|
if (this.resourcePatternResolver != null) {
|
||||||
builder = builder.applyClassLoader(this.resourcePatternResolver.getClassLoader());
|
builder = builder.applyClassLoader(this.resourcePatternResolver.getClassLoader());
|
||||||
}
|
}
|
||||||
|
if (this.hibernateIntegrators != null) {
|
||||||
|
for (Integrator integrator : this.hibernateIntegrators) {
|
||||||
|
builder = builder.applyIntegrator(integrator);
|
||||||
|
}
|
||||||
|
}
|
||||||
this.metadataSources = new MetadataSources(builder.build());
|
this.metadataSources = new MetadataSources(builder.build());
|
||||||
}
|
}
|
||||||
return this.metadataSources;
|
return this.metadataSources;
|
||||||
|
|
|
||||||
|
|
@ -71,7 +71,7 @@ import org.springframework.util.ClassUtils;
|
||||||
* <p>This is designed for programmatic use, e.g. in {@code @Bean} factory methods.
|
* <p>This is designed for programmatic use, e.g. in {@code @Bean} factory methods.
|
||||||
* Consider using {@link LocalSessionFactoryBean} for XML bean definition files.
|
* Consider using {@link LocalSessionFactoryBean} for XML bean definition files.
|
||||||
*
|
*
|
||||||
* <p>Compatible with Hibernate 5.0/5.1 as well as 5.2, as of Spring 4.3.
|
* <p>Compatible with Hibernate 5.0/5.1 as well as 5.2/5.3, as of Spring 5.1.
|
||||||
*
|
*
|
||||||
* @author Juergen Hoeller
|
* @author Juergen Hoeller
|
||||||
* @since 4.2
|
* @since 4.2
|
||||||
|
|
@ -136,7 +136,9 @@ public class LocalSessionFactoryBuilder extends Configuration {
|
||||||
* @param metadataSources the Hibernate MetadataSources service to use (e.g. reusing an existing one)
|
* @param metadataSources the Hibernate MetadataSources service to use (e.g. reusing an existing one)
|
||||||
* @since 4.3
|
* @since 4.3
|
||||||
*/
|
*/
|
||||||
public LocalSessionFactoryBuilder(@Nullable DataSource dataSource, ResourceLoader resourceLoader, MetadataSources metadataSources) {
|
public LocalSessionFactoryBuilder(
|
||||||
|
@Nullable DataSource dataSource, ResourceLoader resourceLoader, MetadataSources metadataSources) {
|
||||||
|
|
||||||
super(metadataSources);
|
super(metadataSources);
|
||||||
|
|
||||||
getProperties().put(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, SpringSessionContext.class.getName());
|
getProperties().put(AvailableSettings.CURRENT_SESSION_CONTEXT_CLASS, SpringSessionContext.class.getName());
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue