Excepción NoClassDefFoundError para CacheProvider

93

Soy un poco nuevo en Spring e hibernate, así que estoy tratando de implementar una aplicación web simple basada en Spring 3 + hibernate 4 mientras inicio tomcat, tengo esta excepción:

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)

Descubrí que esta clase estaba en hibernate-core para hibernate 3 pero no la encontré en hibernate 4.

La parte de mi context.xml para la persistencia:

<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>

Ayúdame a descubrir por qué está intentando cargar CacheProvider porque no tengo ninguna configuración para eso en context.xml y qué jar tengo que agregar en mi proyecto. ¡Gracias!

Fedor Skrynnikov
fuente
¿Puedes publicar el archivo de configuración de hibernación?
Cornel Creanga
No lo tengo Tal vez sea un malentendido y debo agregar que hice exactamente lo que se describe en el capítulo "5.4 Integración de Hibernate con Spring" del libro "Spring in action 3". Mientras hacía eso, tuve algunos problemas con las clases ausentes que encontré en hibernate, así que agregué hibernate 4 a mi proyecto. Pero no fue suficiente
Fedor Skrynnikov
1
¿Estás seguro de que Hibernate 4 tiene esa clase? Intentaría hibernar 3.6.x
Bozho
No. No lo encontré en la versión 4. En realidad, lo encontré pero en otro paquete en ehcache. Pero la pregunta es ¿por qué Tomcat intenta cargarlo? ¿Y es realmente necesario?
Fedor Skrynnikov
Está obsoleto por lo que sé
Cornel Creanga

Respuestas:

184

Cambie su AnnotationSessionFactoryBean a org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) y estará listo para comenzar. El AnnotationSessionFactoryBean fue reemplazado por el LocalSessionFactoryBean, ya que ahora hace el escaneo de rutas de clases.

Aaron Douglas
fuente
¿Alguna otra idea posible? Esto no parece hacer nada por mí. ¿Es necesario cambiar las propiedades?
zod
3
Asegúrese de haber cambiado el paquete de hibernate3 a hibernate4; existe un LocalSessionFactoryBean en ambos paquetes. ¿Qué versión de Spring e Hibernate estás usando?
Aaron Douglas
11

Esto puede deberse a cambios introducidos en Hibernate 4 que no son compatibles con el soporte de Spring para Hibernate. Este problema habla de agregar un paquete separado para admitir hibernación 4. Necesitará Spring 3.1 para esto. La otra opción es seguir con Hibernate 3 si no necesita ninguna característica específica introducida en 4.

gkamal
fuente
Si. Bajé de hiberante 4 a la versión 3.6.7 y todo empezó a funcionar. ¡Gracias!
Fedor Skrynnikov
1
+1, lo hice funcionar con tu consejo y el de Aaron . (O más precisamente, superé esto y encontré otros problemas de Hibernate 4.: P) Por cierto, Spring 3.1 ya no está en RC (primera versión de GA en diciembre de 2011).
Jonik
gracias @gkamal. Down-versioning para hibernate 3 funcionó para mí. Solución: utilicé hibernate-entitymanager e hibernate-core, ambas versiones 3.6.10.Final, consulte mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

la actualización de AnnotationSessionFactoryBean a hibernate4 funciona perfectamente. También asegúrese de que su transactionManager también apunte a 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>
Vishal Jagtap
fuente
0

Un problema realmente simple que causará el mismo error es simplemente tener una falta de coincidencia entre la versión de hibernación en el pom (4.algo) y la versión especificada en la configuración de primavera.

John Lockwood
fuente