2011-09-23 17 views
92

Soy una especie de nuevo en la primavera y de hibernación, así que estoy tratando de poner en práctica algunas sencilla aplicación web basada en la primavera de hibernación 3 + 4 mientras arrancar Tomcat tengo esta excepción:Excepción NoClassDefFoundError para CacheProvider

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) 

he encontrado que esta clase estaba en hibernación núcleos de hibernación 3, pero yo no lo he encontrado en hibernación 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údeme a descubrir por qué está intentando cargar CacheProvider porque no tengo ninguna configuración para eso en context.xml y qué jar debo agregar a mi proyecto. Gracias!

+0

¿Puedes publicar el archivo de configuración de hibernación? –

+0

No lo tengo. Tal vez es un malentendido y debo agregar que hice exactamente lo que se describió en el libro "Spring in action 3" capítulo "5.4 Integrar Hibernate con Spring". Mientras estaba haciendo eso, tuve algunos problemas con las clases ausentes que encontré en Hibernate, así que agregué hibernate 4 a mi proyecto. Pero no fue enouf –

+1

¿estás seguro de que hibernate 4 tiene esa clase? Probaría hibernate 3.6.x – Bozho

Respuesta

183

Cambie su AnnotationSessionFactoryBean a org.springframework.orm.hibernate4.LocalSessionFactoryBean (Hibernate 4) y estará listo. El AnnotationSessionFactoryBean se reemplazó con el LocalSessionFactoryBean, ya que ahora analiza el camino de clase.

+0

Esta es la solución correcta si se usa Hibernate 4 – Mikhail

+0

Cualquier otro ideas posibles? Esto no parece hacer nada por mí. ¿Las propiedades necesitan ser cambiadas? – zod

+3

Asegúrate 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? –

11

Esto podría deberse a cambios introducidos en Hibernate 4 que no son compatibles con el soporte de Spring para Hibernate. Este issue habla de agregar un paquete por separado para soportar hibernate 4. Necesitarás el resorte 3.1 para esto. La otra opción es mantener el hibernate 3 si no necesita ninguna característica específica introducida en 4.

+0

Sí. He bajado de hiberante 4 a la versión 3.6.7 y todo comenzó a funcionar. ¡Gracias! –

+1

+1, lo conseguí trabajando con su consejo y el de [Aaron's] (http://stackoverflow.com/a/8273320/56285). (O más precisamente, superó esto y se encontró con otros problemas de Hibernate 4: P) Por cierto, Spring 3.1 ya no está en RC (primer lanzamiento de GA en diciembre de 2011). – Jonik

+0

thx @gkamal. Down-versioning para hibernar 3 funcionó para mí. Solución: Utilicé hibernate-entitymanager e hibernate-core, ambas versiones 3.6.10.Final ver http://mvnrepository.com/search.html?query=hibernate-entitymanager –

8

actualizando AnnotationSessionFactoryBean a hibernate4 funciona perfecto. También asegúrese de que su transactionManager también apunta 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> 
0

Un problema muy simple que hará que el mismo error es simplemente tener una falta de correspondencia entre la versión de hibernación en el POM (4.Algo) y la versión especificada en la configuración de primavera

Cuestiones relacionadas