Eccezione NoClassDefFoundError per CacheProvider


93

Sono un po 'nuovo in Spring e ibernato, quindi sto cercando di implementare alcune semplici applicazioni web basate su Spring 3 + hibernate 4 mentre avvio Tomcat ho questa eccezione:

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)

Ho scoperto che questa classe era in ibernazione-core per ibernazione 3 ma non l'ho trovata in ibernazione 4.

La parte del mio context.xml per la persistenza:

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

Per favore aiutami a capire perché sta cercando di caricare CacheProvider perché non ho alcuna impostazione per questo in context.xml e quale jar devo aggiungere nel mio progetto. Grazie!


puoi pubblicare il file di configurazione di ibernazione?
Cornel Creanga,

Non ce l'ho. Forse è un malinteso e devo aggiungere che ho fatto esattamente quello che è stato descritto nel libro "Spring in action 3" capitolo "5.4 Integrare Hibernate con Spring". Mentre lo facevo ho avuto dei problemi con le classi assenti che ho trovato in ibernazione, quindi ho aggiunto ibernazione 4 al mio progetto. Ma non era abbastanza
Fedor Skrynnikov

1
sei sicuro che Hibernate 4 abbia quella classe?
Proverei l'

No. Non l'ho trovato nella versione 4. In realtà, l'ho trovato ma in un altro pacchetto in ehcache. Ma la domanda è: perché Tomcat prova a caricarlo? Ed è davvero necessario?
Fedor Skrynnikov

È deprecato da quello che so
Cornel Creanga

Risposte:


184

Cambia il tuo AnnotationSessionFactoryBean in org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) e sarai a posto. AnnotationSessionFactoryBean è stato sostituito con LocalSessionFactoryBean poiché ora esegue la scansione del percorso di classe.


Qualche altra idea possibile? Questo non sembra fare nulla per me. È necessario modificare le proprietà?
Zod

3
Assicurati di aver cambiato il pacchetto da hibernate3 a hibernate4: in entrambi i pacchetti esiste un LocalSessionFactoryBean. Quale versione di Spring and Hibernate stai usando?
Aaron Douglas

11

Ciò potrebbe essere dovuto a modifiche introdotte in Hibernate 4 che non sono compatibili con il supporto Spring per Hibernate. Questo problema parla dell'aggiunta di un pacchetto separato per supportare l'ibernazione 4. Avrai bisogno della primavera 3.1 per questo. L'altra opzione è attenersi a ibernazione 3 se non è necessaria alcuna funzionalità specifica introdotta in 4.


Sì. Sono passato da hiberante 4 alla versione 3.6.7 e tutto è diventato funzionante. Grazie!
Fedor Skrynnikov

1
+1, ho funzionato con i tuoi consigli e quelli di Aaron . (O più precisamente, ho superato questo problema e mi sono imbattuto in altri problemi di Hibernate 4.: P) A proposito, Spring 3.1 non è più in RC (prima versione GA a dicembre 2011).
Jonik

grazie @gkamal. Il down-versioning per ibernare 3 ha funzionato per me. Soluzione: ho usato hibernate-entitymanager e hibernate-core, entrambe le versioni 3.6.10.Final vedi mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be

8

l'aggiornamento di AnnotationSessionFactoryBean a hibernate4 funziona perfettamente. Assicurati inoltre che il tuo transactionManager punti anche 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 davvero semplice che causerà lo stesso errore è semplicemente avere una mancata corrispondenza tra la versione di ibernazione nel pom (4.qualcosa) e la versione specificata nella configurazione di primavera.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.