|
18 | 18 |
|
19 | 19 | import java.io.IOException;
|
20 | 20 | import java.lang.annotation.Annotation;
|
| 21 | +import java.lang.reflect.Method; |
21 | 22 | import java.util.LinkedHashSet;
|
| 23 | +import java.util.Properties; |
22 | 24 | import java.util.Set;
|
23 | 25 | import javax.persistence.Embeddable;
|
24 | 26 | import javax.persistence.Entity;
|
|
29 | 31 | import org.hibernate.HibernateException;
|
30 | 32 | import org.hibernate.MappingException;
|
31 | 33 | import org.hibernate.SessionFactory;
|
| 34 | +import org.hibernate.cache.spi.RegionFactory; |
32 | 35 | import org.hibernate.cfg.AvailableSettings;
|
33 | 36 | import org.hibernate.cfg.Configuration;
|
34 | 37 | import org.hibernate.cfg.Environment;
|
| 38 | +import org.hibernate.cfg.Settings; |
35 | 39 | import org.hibernate.engine.transaction.internal.jta.CMTTransactionFactory;
|
| 40 | +import org.hibernate.service.ServiceRegistry; |
36 | 41 |
|
37 | 42 | import org.springframework.core.io.Resource;
|
38 | 43 | import org.springframework.core.io.ResourceLoader;
|
@@ -97,6 +102,8 @@ public class LocalSessionFactoryBuilder extends Configuration {
|
97 | 102 |
|
98 | 103 | private final ResourcePatternResolver resourcePatternResolver;
|
99 | 104 |
|
| 105 | + private RegionFactory cacheRegionFactory; |
| 106 | + |
100 | 107 |
|
101 | 108 | /**
|
102 | 109 | * Create a new LocalSessionFactoryBuilder for the given DataSource.
|
@@ -199,6 +206,18 @@ public LocalSessionFactoryBuilder setCurrentTenantIdentifierResolver(Object curr
|
199 | 206 | return this;
|
200 | 207 | }
|
201 | 208 |
|
| 209 | + /** |
| 210 | + * Set the Hibernate RegionFactory to use for the SessionFactory. |
| 211 | + * Allows for using a Spring-managed RegionFactory instance. |
| 212 | + * <p>Note: If this is set, the Hibernate settings should not define a |
| 213 | + * cache provider to avoid meaningless double configuration. |
| 214 | + * @see org.hibernate.cache.spi.RegionFactory |
| 215 | + */ |
| 216 | + public LocalSessionFactoryBuilder setCacheRegionFactory(RegionFactory cacheRegionFactory) { |
| 217 | + this.cacheRegionFactory = cacheRegionFactory; |
| 218 | + return this; |
| 219 | + } |
| 220 | + |
202 | 221 | /**
|
203 | 222 | * Add the given annotated classes in a batch.
|
204 | 223 | * @see #addAnnotatedClass
|
@@ -273,6 +292,24 @@ private boolean matchesEntityTypeFilter(MetadataReader reader, MetadataReaderFac
|
273 | 292 | }
|
274 | 293 |
|
275 | 294 |
|
| 295 | + // Overridden methods from Hibernate's Configuration class |
| 296 | + |
| 297 | + @Override |
| 298 | + public Settings buildSettings(Properties props, ServiceRegistry serviceRegistry) throws HibernateException { |
| 299 | + Settings settings = super.buildSettings(props, serviceRegistry); |
| 300 | + if (this.cacheRegionFactory != null) { |
| 301 | + try { |
| 302 | + Method setRegionFactory = Settings.class.getDeclaredMethod("setRegionFactory", RegionFactory.class); |
| 303 | + setRegionFactory.setAccessible(true); |
| 304 | + setRegionFactory.invoke(settings, this.cacheRegionFactory); |
| 305 | + } |
| 306 | + catch (Exception ex) { |
| 307 | + throw new IllegalStateException("Failed to invoke Hibernate's setRegionFactory method", ex); |
| 308 | + } |
| 309 | + } |
| 310 | + return settings; |
| 311 | + } |
| 312 | + |
276 | 313 | /**
|
277 | 314 | * Build the {@code SessionFactory}.
|
278 | 315 | */
|
|
0 commit comments