6

私はEHCacheに基づいて2次キャッシュでSpringブートアプリケーションを設定しようとしています。私はこの例外を取得してい :EHCache設定+春のブート:NoCacheRegionFactoryAvailableException

Exception in thread "main" org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaAutoConfiguration.class]: Invocation of init method  failed; nested exception is org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the  hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath. 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1554) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475) 
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:302) 
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193) 
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:975) 
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:752) 
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482) 
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:109) 
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:691) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:320) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:952) 
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:941) 
    at com.yes.wizard.Application.main(Application.java:30) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 
Caused by: org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache. region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath. 
    at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:83) 
    at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364) 
    at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1859) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:852) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:845) 
    at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:398) 
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:844) 
    at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:152) 
    at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:338) 
    at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1613) 
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1550) 
    ... 20 more  

は、これは私の設定です:

Application.class:

@EnableAutoConfiguration 
@Configuration 
@ComponentScan 
@ImportResource(value = "/ws.xml") 
public class Application { 

    public static void main(String[] args) throws Exception { 
     SpringApplication.run(Application.class, args); 
    } 
} 

CacheConfig.class:

@Configuration 
@EnableCaching 
public class CachingConfig implements CachingConfigurer { 

    @Bean 
    @Override 
    public CacheManager cacheManager() { 
     EhCacheCacheManager cacheManager = new EhCacheCacheManager(); 
     cacheManager.setCacheManager(ehCacheManagerFactoryBean().getObject()); 
     return cacheManager; 
    } 

    @Bean 
    @Override 
    public KeyGenerator keyGenerator() { 
     return new SimpleKeyGenerator(); 
    } 

    @Bean 
    public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() { 
     EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean(); 
     ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml")); 
     ehCacheManagerFactoryBean.setCacheManagerName("messageCache"); 
     ehCacheManagerFactoryBean.setShared(true); 
     return ehCacheManagerFactoryBean; 
    } 
} 

MyEntity:

@Entity 
@XmlRootElement 
@Table(name = "my_entity") 
@Cacheable(value = true) 
@Cache(usage = CacheConcurrencyStrategy.READ_ONLY) 
public class MyEntity { ... } 

ehcache.xml:これを引き起こしている何

<?xml version="1.0" encoding="UTF-8"?> 
<ehcache> 
    <defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" /> 
    <cache name="messageCache" maxElementsInMemory="10" eternal="true" overflowToDisk="false" /> 
</ehcache> 

+0

SpringキャッシュとHibernate第2レベルのキャッシュは異なるものです... –

+0

EHCacheは、休止状態の第2レベルのキャッシュとして使用されています。私の場合、Springデータjpa(休止状態)を使用しています。だから私の混乱はどこですか? – etingertal

+0

明記したように、抽象的なキャッシュと、JPAプロバイダの第2レベルキャッシュの使用は、互いに関係ありません。基本的にSpring Cachingの設定は何もしないか、少なくともあなたが持っているエラーには関係しません。 –

答えて

16

エラーメッセージの重要な部分である:

第2レベル・キャッシュはアプリケーションで使用されるが、プロパティhibernate.cache.region.factory_classが与えられていません。あなたは春ブーツの中factory_classプロパティを設定することができ、クラスパス

で提供されています(休止状態-infinispan、例えば)hibernate.cache.region.factory_class設定を使用して、第2レベルのキャッシュや設定が正しい地域の工場を無効にして、二次キャッシュ・プロバイダーを確認してどちらかしてくださいすることapplication.propertiesファイル。例:

spring.jpa.properties.hibernate.cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory 

使用する必要があるクラス名は、EhCacheの依存関係によって異なります。この場合、私はhibernate-ehcacheを使用しました。

+0

私は同じですが、': 'の代わりに' = 'を使用しました。作業。なぜ異なるプロパティ形式ですか?申し訳ありませんが、これはここでの質問ではありませんが、あなたのおかげで、私の問題が何であるかを知りました(そして、この質問に打たれました)。 – HankCa

+1

プロパティファイル内でキーと値を区切るには、 '='または ':'を使用できます –

+0

これは私が思ったものです。私はもう一度それを試して、動作します。私はそれを前にコピーしたときから面白い性格を持っていたに違いない。すべてうまく! – HankCa

関連する問題