|
23 | 23 |
|
24 | 24 | import org.hibernate.Interceptor;
|
25 | 25 | import org.hibernate.SessionFactory;
|
| 26 | +import org.hibernate.boot.MetadataSources; |
26 | 27 | import org.hibernate.boot.model.naming.ImplicitNamingStrategy;
|
27 | 28 | import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
|
| 29 | +import org.hibernate.boot.registry.BootstrapServiceRegistryBuilder; |
28 | 30 | import org.hibernate.cfg.Configuration;
|
29 | 31 | import org.hibernate.context.spi.CurrentTenantIdentifierResolver;
|
30 | 32 |
|
|
40 | 42 | import org.springframework.core.io.support.ResourcePatternUtils;
|
41 | 43 | import org.springframework.core.task.AsyncTaskExecutor;
|
42 | 44 | import org.springframework.core.type.filter.TypeFilter;
|
| 45 | +import org.springframework.util.Assert; |
43 | 46 |
|
44 | 47 | /**
|
45 | 48 | * {@link FactoryBean} that creates a Hibernate
|
@@ -96,7 +99,9 @@ public class LocalSessionFactoryBean extends HibernateExceptionTranslator
|
96 | 99 |
|
97 | 100 | private AsyncTaskExecutor bootstrapExecutor;
|
98 | 101 |
|
99 |
| - private ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver(); |
| 102 | + private MetadataSources metadataSources; |
| 103 | + |
| 104 | + private ResourcePatternResolver resourcePatternResolver; |
100 | 105 |
|
101 | 106 | private Configuration configuration;
|
102 | 107 |
|
@@ -318,15 +323,58 @@ public void setBootstrapExecutor(AsyncTaskExecutor bootstrapExecutor) {
|
318 | 323 | this.bootstrapExecutor = bootstrapExecutor;
|
319 | 324 | }
|
320 | 325 |
|
| 326 | + /** |
| 327 | + * Specify a Hibernate {@link MetadataSources} service to use (e.g. reusing an |
| 328 | + * existing one), potentially populated with a custom Hibernate bootstrap |
| 329 | + * {@link org.hibernate.service.ServiceRegistry} as well. |
| 330 | + * @since 4.3 |
| 331 | + */ |
| 332 | + public void setMetadataSources(MetadataSources metadataSources) { |
| 333 | + Assert.notNull(metadataSources, "MetadataSources must not be null"); |
| 334 | + this.metadataSources = metadataSources; |
| 335 | + } |
| 336 | + |
| 337 | + /** |
| 338 | + * Determine the Hibernate {@link MetadataSources} to use. |
| 339 | + * <p>Can also be externally called to initialize and pre-populate a {@link MetadataSources} |
| 340 | + * instance which is then going to be used for {@link SessionFactory} building. |
| 341 | + * @return the MetadataSources to use (never {@code null}) |
| 342 | + * @since 4.3 |
| 343 | + * @see LocalSessionFactoryBuilder#LocalSessionFactoryBuilder(DataSource, ResourceLoader, MetadataSources) |
| 344 | + */ |
| 345 | + public MetadataSources getMetadataSources() { |
| 346 | + if (this.metadataSources == null) { |
| 347 | + this.metadataSources = new MetadataSources(new BootstrapServiceRegistryBuilder().build()); |
| 348 | + } |
| 349 | + return this.metadataSources; |
| 350 | + } |
| 351 | + |
| 352 | + /** |
| 353 | + * Specify a Spring {@link ResourceLoader} to use for Hibernate metadata. |
| 354 | + * @param resourceLoader the ResourceLoader to use (never {@code null}) |
| 355 | + */ |
321 | 356 | @Override
|
322 | 357 | public void setResourceLoader(ResourceLoader resourceLoader) {
|
323 | 358 | this.resourcePatternResolver = ResourcePatternUtils.getResourcePatternResolver(resourceLoader);
|
324 | 359 | }
|
325 | 360 |
|
| 361 | + /** |
| 362 | + * Determine the Spring {@link ResourceLoader} to use for Hibernate metadata. |
| 363 | + * @return the ResourceLoader to use (never {@code null}) |
| 364 | + * @since 4.3 |
| 365 | + */ |
| 366 | + public ResourceLoader getResourceLoader() { |
| 367 | + if (this.resourcePatternResolver == null) { |
| 368 | + this.resourcePatternResolver = new PathMatchingResourcePatternResolver(); |
| 369 | + } |
| 370 | + return this.resourcePatternResolver; |
| 371 | + } |
| 372 | + |
326 | 373 |
|
327 | 374 | @Override
|
328 | 375 | public void afterPropertiesSet() throws IOException {
|
329 |
| - LocalSessionFactoryBuilder sfb = new LocalSessionFactoryBuilder(this.dataSource, this.resourcePatternResolver); |
| 376 | + LocalSessionFactoryBuilder sfb = new LocalSessionFactoryBuilder( |
| 377 | + this.dataSource, getResourceLoader(), getMetadataSources()); |
330 | 378 |
|
331 | 379 | if (this.configLocations != null) {
|
332 | 380 | for (Resource resource : this.configLocations) {
|
|
0 commit comments