CacheProvider的异常NoClassDefFoundError


93

我在Spring和Hibernate中是新手,因此我尝试基于Spring 3 + Hibernate 4来实现一些简单的Web应用程序,而当我启动tomcat时,我有以下异常:

java.lang.NoClassDefFoundError: org/hibernate/cache/CacheProvider
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
at java.lang.Class.getDeclaredMethods(Class.java:1791)
    ...
Caused by: java.lang.ClassNotFoundException: org.hibernate.cache.CacheProvider
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1678)
at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1523)

我发现该类在hibernate 3的hibernate-core中,但是在hibernate 4中却找不到它。

我的context.xml中用于持久性的部分:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:oracle:thin:@IP_Address:SID"/>
    <property name="username" value="xxx"/>
    <property name="password" value="xxx"/>
    <property name="initialSize" value="5"/>
    <property name="maxActive" value="20"/>
</bean>

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.huawei.vms.user"/>
    <property name="hibernateProperties">
        <props>
            <prop key="dialect">org.hibernate.dialect.Oracle10gDialect</prop>
        </props>
    </property>
</bean>

请帮助我弄清楚为什么要尝试加载CacheProvider,因为在context.xml中没有任何设置,我必须在项目中添加哪个jar。谢谢!


你可以发布休眠配置文件吗?
Cornel Creanga

我没有 也许这是一种误解,我还必须补充说,我确实做了《 Spring in action 3》一章“ 5.4将Hibernate与Spring集成”中描述的内容。在执行此操作时,我在休眠中发现了一些缺少类的问题,因此我将休眠4添加到了项目中。但这还不是问题
Fedor

1
您确定休眠4具有该类吗?我会尝试休眠3.6.x
Bozho 2011年

否。我在版本4中找不到它。实际上,我在ehcache的另一个软件包中找到了它。但是问题是为什么tomcat尝试加载它?实际需要吗?
Fedor Skrynnikov

据我所知,它已被弃用
Cornel Creanga

Answers:


184

将您的AnnotationSessionFactoryBean更改为org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4),您会很方便。AnnotationSessionFactoryBean已被LocalSessionFactoryBean替换,因为它现在进行类路径扫描。


还有其他想法吗?这似乎对我没有任何帮助。是否需要更改属性?
zod 2012年

3
确保已将包从hibernate3更改为hibernate4-两个包中都存在LocalSessionFactoryBean。您正在使用哪个版本的Spring和Hibernate?
亚伦·道格拉斯

11

这可能是由于Hibernate 4中引入的更改与Spring对Hibernate的支持不兼容所致。这个问题有关添加单独的包来支持休眠4.您将需要3.1春天这个会谈。另一个选择是,如果您不需要4中引入的任何特定功能,则坚持使用冬眠3。


是。我已经从hiberante 4降级到3.6.7版,一切正常。谢谢!
Fedor Skrynnikov

1
+1,在您和亚伦的建议下都可以使用。(或者更确切地说,克服了这一点,并遇到了其他Hibernate 4问题。
Jonik

thx @gkamal。降级到休眠3对我有用。解决方案:我使用了3.6.10.hibernate-entitymanager和hibernate-core版本,最终请参见mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be

8

将AnnotationSessionFactoryBean更新为hibernate4效果很好。还要确保您的transactionManager也指向hibernate4,

<bean id="sessionFactory"
 class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 <property name="dataSource" ref="dataSource"></property>
 <property name="packagesToScan" value="PACKAGE_NAME"></property>
 <property name="hibernateProperties">
    <props>
        <prop key="dialect">org.hibernate.dialect.MySQLDialect</prop>
    </props>
 </property>    
</bean>

<bean id="transactionManager" 
  class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory"></property>
</bean>

0

一个会导致相同错误的非常简单的问题就是pom(4.something)中的休眠版本与spring config中指定的版本之间不匹配。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.