web-dev-qa-db-fra.com

Exception NoClassDefFoundError pour CacheProvider

Je suis un peu nouveau dans Spring et hibernate, alors j'essaie d'implémenter une application Web simple basée sur Spring 3 + hibernate 4 pendant que je lance Tomcat. J'ai cette exception:

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)

J'ai trouvé que cette classe était en mode hibernation de base pour hibernation 3, mais je ne l'ai pas trouvée dans hibernate 4.

La partie de mon fichier context.xml pour la persistance:

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

S'il vous plaît, aidez-moi à comprendre pourquoi il essaie de charger CacheProvider parce que je n'ai aucun paramètre pour cela dans context.xml et quel fichier jar je dois ajouter dans mon projet. Merci!

93
Fedor Skrynnikov

Changez votre AnnotationSessionFactoryBean en org.springframework.orm.hibernate4.LocalSessionFactoryBean (Hibernate 4) et vous serez prêt à partir. AnnotationSessionFactoryBean a été remplacé par LocalSessionFactoryBean car il effectue actuellement un balayage du chemin des classes.

184
Aaron Douglas

Cela pourrait être dû aux modifications introduites dans Hibernate 4 qui ne sont pas compatibles avec la prise en charge de Spring pour Hibernate. Ceci numéro parle de l'ajout d'un paquet séparé pour supporter hibernate 4. Vous aurez besoin de Spring 3.1 pour cela. L'autre option consiste à rester en veille prolongée 3 si vous n'avez besoin d'aucune fonctionnalité spécifique introduite dans 4.

11
gkamal

mettre à jour AnnotationSessionFactoryBean vers hibernate4 fonctionne parfaitement. Assurez-vous également que votre transactionManager pointe également sur 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>
8
Vishal Jagtap

Un problème très simple qui provoquera la même erreur est simplement d’avoir une discordance entre la version en veille prolongée dans le pom (quelque chose) et la version spécifiée dans la config du printemps.

0
John Lockwood