Exception NoClassDefFoundError pour CacheProvider

93

Je suis un peu nouveau dans Spring et hibernate, donc j'essaie d'implémenter une application Web simple basée sur Spring 3 + hibernate 4 pendant que je démarre 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 hibernate-core pour hibernate 3 mais je ne l'ai pas trouvée dans hibernate 4.

La partie de mon 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 car je n'ai pas de paramètres pour cela dans context.xml et quel fichier jar je dois ajouter à mon projet. Merci!

Fedor Skrynnikov
la source
pouvez-vous publier le fichier de configuration de mise en veille prolongée?
Cornel Creanga
Je ne l'ai pas. C'est peut-être un malentendu et je dois ajouter que j'ai fait exactement ce qui a été décrit dans le livre "Spring in action 3", chapitre "5.4 Intégrer Hibernate avec Spring". Pendant que je faisais cela, j'ai eu quelques problèmes avec les classes absentes que j'ai trouvées dans hibernate, j'ai donc ajouté hibernate 4 dans mon projet. Mais ce n'était pas assez
Fedor Skrynnikov
1
êtes-vous sûr que hibernate 4 a cette classe? J'essaierais Hibernate 3.6.x
Bozho
Non, je ne l'ai pas trouvé dans la version 4. En fait, je l'ai trouvé mais dans un autre paquet dans ehcache. Mais la question est de savoir pourquoi Tomcat essaie de le charger? Et est-ce vraiment nécessaire?
Fedor Skrynnikov
C'est obsolète d'après ce que je sais
Cornel Creanga

Réponses:

184

Remplacez votre AnnotationSessionFactoryBean par org.springframework.orm.hibernate4.LocalSessionFactoryBean (Hibernate 4) et vous serez prêt à partir. AnnotationSessionFactoryBean a été remplacé par LocalSessionFactoryBean comme il le fait actuellement pour l'analyse du chemin de classe.

Aaron Douglas
la source
D'autres idées possibles? Cela ne semble rien faire pour moi. Les propriétés doivent-elles être modifiées?
zod
3
Assurez-vous que vous avez changé le paquet de hibernate3 à hibernate4 - un LocalSessionFactoryBean existe dans les deux paquets. Quelle version de Spring et Hibernate utilisez-vous?
Aaron Douglas
11

Cela peut être dû à des changements introduits dans Hibernate 4 qui ne sont pas compatibles avec la prise en charge de Spring pour Hibernate. Ce numéro parle de l'ajout d'un package séparé pour prendre en charge la mise en veille prolongée 4. Vous aurez besoin du printemps 3.1 pour cela. L'autre option est de s'en tenir à la mise en veille prolongée 3 si vous n'avez besoin d'aucune fonctionnalité spécifique introduite dans 4.

gkamal
la source
Oui. J'ai rétrogradé de hiberante 4 à la version 3.6.7 et tout est devenu opérationnel. Merci!
Fedor Skrynnikov le
1
+1, je l'ai fait fonctionner avec vos conseils et ceux d' Aaron . (Ou plus précisément, j'ai dépassé cela et rencontré d'autres problèmes Hibernate 4.: P) Au fait, Spring 3.1 n'est plus en RC (première version GA en décembre 2011).
Jonik
merci @gkamal. Le down-versioning pour Hibernate 3 a fonctionné pour moi. Solution: j'ai utilisé hibernate-entitymanager et hibernate-core, tous deux version 3.6.10.Final voir mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

la mise à jour de AnnotationSessionFactoryBean vers hibernate4 fonctionne parfaitement. Assurez-vous également que votre transactionManager pointe également vers 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
la source
0

Un problème très simple qui causera la même erreur est simplement d'avoir une discordance entre la version hibernate dans le pom (4. quelque chose) et la version spécifiée dans la configuration de printemps.

John Lockwood
la source