使用EhCache在Hibernate缓存上设置java.lang.NoSuchMethodError

使用EhCache在Hibernate缓存上设置java.lang.NoSuchMethodError,hibernate,ehcache,Hibernate,Ehcache,我试图在Hibernate 5.2.4+Spring 4.3.7上向我的项目添加缓存,但调用getCurrentSession().get(entityClass,id)方法时出错: java.lang.NoSuchMethodError:org.hibernate.cache.internal.DefaultCacheKeysFactory.staticCreateEntityKey(Ljava/lang/Object;Lorg/hibernate/persister/entity/Entit

我试图在Hibernate 5.2.4+Spring 4.3.7上向我的项目添加缓存,但调用
getCurrentSession().get(entityClass,id)
方法时出错:

java.lang.NoSuchMethodError:
org.hibernate.cache.internal.DefaultCacheKeysFactory.staticCreateEntityKey(Ljava/lang/Object;Lorg/hibernate/persister/entity/EntityTypersister;Lorg/hibernate/engine/spi/SessionFactoryImplementor;Ljava/lang/String;)Ljava/lang/Object

休眠配置:

@Configuration
@EnableTransactionManagement
@PropertySource(value = {"classpath:hibernate.properties"})
public class HibernateConfig {
    private Environment environment;

    @Autowired
    HibernateConfig(Environment environment){
        this.environment = environment;
    }

    @Bean
    public LocalSessionFactoryBean sessionFactory(){
        LocalSessionFactoryBean localSessionFactoryBean = new LocalSessionFactoryBean();
        localSessionFactoryBean.setDataSource(dataSource());
        localSessionFactoryBean.setPackagesToScan("io.delivery.entity");
        localSessionFactoryBean.setHibernateProperties(hibernateProperties());
        return localSessionFactoryBean;
    }

    @Bean
    public DataSource dataSource(){
        DriverManagerDataSource dataSource = new DriverManagerDataSource();
        dataSource.setDriverClassName(environment.getProperty("hibernate.driverClass"));
        dataSource.setUrl(environment.getProperty("hibernate.url"));
        dataSource.setUsername(environment.getProperty("hibernate.username"));
        dataSource.setPassword(environment.getProperty("hibernate.password"));
        return dataSource;
    }

    private Properties hibernateProperties(){
        Properties properties = new Properties();
        properties.put("hibernate.dialect", environment.getRequiredProperty("hibernate.dialect"));
        properties.put("hibernate.show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.format_sql", environment.getRequiredProperty("hibernate.format_sql"));
        properties.put("hibernate.hbm2ddl.auto", environment.getRequiredProperty("hibernate.hbm2ddl.auto"));
        properties.put("show_sql", environment.getRequiredProperty("hibernate.show_sql"));
        properties.put("hibernate.cache.region.factory_class", environment.getRequiredProperty("hibernate.cache.region.factory_class"));
        return properties;
    }

    @Bean
    @Autowired
    public HibernateTransactionManager transactionManager(SessionFactory sessionFactory){
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(sessionFactory);
        return transactionManager;
    }
hibernate.properties:

hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory
pom.xml:

<!-- hibernate-jcache -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-jcache</artifactId>
    <version>5.2.10.Final</version>
</dependency>
<!-- hibernate-ehcache -->
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.2.10.Final</version>
</dependency>
<!-- ehcache -->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>2.10.4</version>
</dependency>

org.hibernate
冬眠
5.2.10.最终版本
org.hibernate
休眠ehcache
5.2.10.最终版本
net.sf.ehcache
ehcache
2.10.4

我做错了什么?

Hibernate 5.2以两种方式支持Ehcache。Ehcache 2(您正在使用的)本机受
hibernate Ehcache
支持。通过JCache支持Ehcache 3

假设您继续使用Ehcache 2(它与您选择的区域工厂相匹配),您应该删除
hibernate jcache

然后,您需要确保已经导入了Hibernate 5版本的
LocalSessionFactoryBean

我这样做了,效果非常好。我的进口:

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
我的pom(jcache仍然存在,但不需要):


com.h2数据库
氢
1.4.195
运行时
org.springframework
弹簧芯
4.3.7.1发布
org.springframework
spring上下文
4.3.7.1发布
org.springframework
SpringJDBC
4.3.7.1发布
org.springframework
春季甲虫
4.3.7.1发布
org.hibernate
冬眠
5.2.10.最终版本
org.hibernate
休眠ehcache
5.2.10.最终版本
net.sf.ehcache
ehcache
2.10.4

Hibernate 5.2以两种方式支持Ehcache。Ehcache 2(您正在使用的)本机受
hibernate Ehcache
支持。通过JCache支持Ehcache 3

假设您继续使用Ehcache 2(它与您选择的区域工厂相匹配),您应该删除
hibernate jcache

然后,您需要确保已经导入了Hibernate 5版本的
LocalSessionFactoryBean

我这样做了,效果非常好。我的进口:

import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import org.springframework.orm.hibernate5.HibernateTransactionManager;
import org.springframework.orm.hibernate5.LocalSessionFactoryBean;
import org.springframework.transaction.annotation.EnableTransactionManagement;
我的pom(jcache仍然存在,但不需要):


com.h2数据库
氢
1.4.195
运行时
org.springframework
弹簧芯
4.3.7.1发布
org.springframework
spring上下文
4.3.7.1发布
org.springframework
SpringJDBC
4.3.7.1发布
org.springframework
春季甲虫
4.3.7.1发布
org.hibernate
冬眠
5.2.10.最终版本
org.hibernate
休眠ehcache
5.2.10.最终版本
net.sf.ehcache
ehcache
2.10.4

我与hibernate core有版本冲突!将5.2.4.Final添加到pom.xml中的属性中,并在所有hibernate依赖项中引用${hibernate.version}解决了问题。

我与hibernate core的版本冲突!将5.2.4.Final添加到pom.xml中的属性中,并在所有hibernate依赖项中引用${hibernate.version}解决了问题。

您能否确保在类路径上不会出现冲突的hibernate依赖项?很可能您是对的,但我仍然不能确切地理解冲突在哪里。你是对的:我与hibernate core有版本冲突!将5.2.4.Final添加到pom.xml中的属性中,并在所有hibernate依赖项中引用${hibernate.version}解决了这个问题。谢谢!你能确保你的类路径上没有出现冲突的hibernate依赖项吗?很可能你是对的,但我仍然不能确切地理解冲突的位置。你是对的:我与hibernate core有版本冲突!将5.2.4.Final添加到pom.xml中的属性中,并在所有hibernate依赖项中引用${hibernate.version}解决了这个问题。谢谢!是的,我有相同的导入和导入javax.sql.DataSource;导入java.util.Properties;我从pom.xml中删除了hibernate jcache,但仍然有一个错误;导入java.util.Properties;我从pom.xml中删除了hibernate jcache,但仍然有一个错误。是的。我应该补充一点,那么,所有的依赖关系都应该是一致的。我应该补充一点,那么,您的所有依赖关系都应该是一致的。