Java 使用EhCache休眠二级缓存
我想在hibernate中配置二级缓存。我发现了并做到了。但我有个例外:Java 使用EhCache休眠二级缓存,java,spring,hibernate,ehcache,Java,Spring,Hibernate,Ehcache,我想在hibernate中配置二级缓存。我发现了并做到了。但我有个例外: 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 le
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) ~[NoCachingRegionFactory.class:4.3.3.Final]
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:364) ~[SessionFactoryImpl.class:4.3.3.Final]
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1857) ~[Configuration.class:4.3.3.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:850) ~[EntityManagerFactoryBuilderImpl$4.class:4.3.4.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl$4.perform(EntityManagerFactoryBuilderImpl.java:843) ~[EntityManagerFactoryBuilderImpl$4.class:4.3.4.Final]
at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.withTccl(ClassLoaderServiceImpl.java:397) ~[ClassLoaderServiceImpl.class:4.3.3.Final]
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:842) ~[EntityManagerFactoryBuilderImpl.class:4.3.4.Final]
at org.hibernate.jpa.HibernatePersistenceProvider.createContainerEntityManagerFactory(HibernatePersistenceProvider.java:150) ~[HibernatePersistenceProvider.class:4.3.4.Final]
和EntityManager配置。我不认为这是这里的主要问题,但我将向它展示代码:
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
LocalContainerEntityManagerFactoryBean emf = new LocalContainerEntityManagerFactoryBean();
emf.setDataSource(dataSource());
emf.setPackagesToScan("com.smartestgift.*");
//let Hibernate know which database we're using.
//note that this is vendor specific, not JPA
Map opts = emf.getJpaPropertyMap();
opts.put("hibernate.dialect", env.getProperty("hibernate.dialect"));
HibernateJpaVendorAdapter va = new HibernateJpaVendorAdapter();
emf.setJpaVendorAdapter(va);
return emf;
}
我不明白出了什么问题。为什么hibernate看不到该属性
更新:
丹尼姆-谢谢!您是对的,我删除了entity manager并重构了sessionFactory方法,现在看起来是这样的:
@Bean
public SessionFactory sessionFactory() {
LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean();
sessionFactoryBean.setDataSource(dataSource());
sessionFactoryBean.setPackagesToScan("com.smartestgift.*");
Properties hibernateProperties = new Properties();
hibernateProperties.put("hibernate.connection.characterEncoding", "UTF-8");
hibernateProperties.put("hibernate.connection.charSet", "UTF-8");
hibernateProperties.put("hibernate.dialect", "org.hibernate.dialect.PostgreSQL82Dialect");
hibernateProperties.put("hibernate.show_sql", "true");
hibernateProperties.put("hibernate.format_sql", "true");
//hibernateProperties.put("hibernate.generate_statistics", env.getProperty("hibernate.generate_statistics"));
hibernateProperties.put("hibernate.enable_lazy_load_no_trans", "true");
// second level cache
hibernateProperties.put("hibernate.cache.use_second_level_cache", "true");
hibernateProperties.put("hibernate.cache.use_query_cache", "true");
hibernateProperties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
//hibernateProperties.put("net.sf.ehcache.configurationResourceName", env.getProperty("net.sf.ehcache.configurationResourceName"));
// testing
hibernateProperties.put("hibernate.bytecode.use_reflection_optimizer", false);
hibernateProperties.put("hibernate.check_nullability", false);
hibernateProperties.put("hibernate.search.autoregister_listeners", false);
sessionFactoryBean.setHibernateProperties(hibernateProperties);
try {
sessionFactoryBean.afterPropertiesSet();
} catch (Exception e) {
e.printStackTrace();
return null;
}
return sessionFactoryBean.getObject();
}
但现在我遇到了一个新问题,我不知道如何实现OpenEntityManagerViewInterceptor,因为在删除实体管理器之前,我有下一个代码:
OpenEntityManagerInViewInterceptor interceptor = new OpenEntityManagerInViewInterceptor();
interceptor.setEntityManagerFactory(entityManagerFactory().getObject());
但是现在我还没有entityManagerFactory,我不知道现在如何制作这个拦截器…我想,要配置二级缓存,您需要声明一个附加配置文件,其中包含提供程序所需的所有参数以及stacktrace中清楚显示的参数,您还需要更多我清楚地了解是什么错误,怎么办。它是关于hibernate属性的:setProperty(“hibernate.cache.region.factory_class”,“org.hibernate.cache.ehcache.EhCacheRegionFactory”);但是我不明白为什么会出现这个错误,因为我声明了这个属性,但是hibernate不想看到它。您是否确保
org.hibernate.cache.ehcache.EhCacheRegionFactory
在您的项目中可用?为什么要配置SessionFactory
和EntityManagerFactory
?两者都在管理相同的实体。德尼恩,谢谢你。我删除EntityManagerFactory,重构sessionFactory的方法,添加一些代码。错误消失了!但现在我不知道如何实现OpenEntityManagerViewInterceptor。因为在删除EntityManagerFactory之前,我将拦截器设置为:OpenEntityManagerInViewInterceptor=new OpenEntityManagerInViewInterceptor();然后是interceptor.setEntityManagerFactory(entityManagerFactory().getObject());它是有效的,但现在我没有完整的管理器。请写下关于删除EntityManager的qeustion的答案,并回答我的新问题。谢谢。
OpenEntityManagerInViewInterceptor interceptor = new OpenEntityManagerInViewInterceptor();
interceptor.setEntityManagerFactory(entityManagerFactory().getObject());