spring-projects / spring-boot

Spring Boot
https://spring.io/projects/spring-boot
Apache License 2.0
74.21k stars 40.47k forks source link

Add support for configuring Hibernate L2 Cache #14586

Open marceloverdijk opened 5 years ago

marceloverdijk commented 5 years ago

As discussed with @snicoll on Gitter, it would be nice if Spring Boot could offer an easy way to use the JCache CacheManager created by Spring Boot with the Hibernate second-level cache.

Hibernate supports different L2 caching options which can be set by e.g. using specific properties like:

spring.jpa.hibernate.cache.region.factory_class=jcache
spring.jpa.hibernate.javax.cache.provider=org.ehcache.jsr107.EhcacheCachingProvider
spring.jpa.hibernate.javax.cache.uri=classpath:ehcache3.xml

However Hibernate also supports explicitly setting the cache manager which can be done via a custom HibernatePropertiesCustomizer like:

@Configuration
public class HibernateConfig {

    @Autowired
    private CacheManager cacheManager;

    @Bean
    public HibernatePropertiesCustomizer hibernatePropertiesCustomizer() {
        return hibernateProperties -> hibernateProperties.put(ConfigSettings.CACHE_MANAGER, cacheManager);
    }
}

It would be nice if Spring Boot could offer a specific property like spring.jpa.hibernate.use-explicit-cache-manager, which when set to true auto configures a HibernatePropertiesCustomizer which sets the cache manager automatically?

PS: This also relates to PR #14570 adding documentation how set up Hibernate second-level caching currently.

snicoll commented 5 years ago

I am not keen to add a specific property. IMO, this should happen out-of-the-box based on the context (single JCacheCacheManager available and JCache integration library on the classpath).

Is there any reason you want this to be a property?

I'd like to understand the effect of setting it unconditionally but haven't found it referenced in the doc so I've raised HHH-13009

marceloverdijk commented 5 years ago

Yes, out-of-the-box based on the context is also fine. No specific reason for an explicit property.

snicoll commented 5 years ago

I've documented things in #14734 and it looks like auto-adding the customizer in the case of JCache should be enough. There is also integration for EhCache 2 and Infinispan so it would be nice to reasearch how we can support that.

The support can be easily disabled using spring.jpa.properties.hibernate.cache.use_second_level_cache (that is true by default).

andvasp commented 4 years ago

Would be good spring do it automatically. Otherwise we have to do as @marceloverdijk mentioned above to use the same config file.