Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用EhCache休眠二级缓存_Java_Spring_Hibernate_Ehcache - Fatal编程技术网

Java 使用EhCache休眠二级缓存

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

我想在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 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());