Wyjątek NoClassDefFoundError dla CacheProvider

93

Jestem trochę nowy na wiosnę i hibernację, więc próbuję zaimplementować prostą aplikację internetową opartą na Spring 3 + hibernate 4, podczas gdy uruchamiam tomcat Mam ten wyjątek:

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)

Odkryłem, że ta klasa była w stanie hibernacji rdzenia dla hibernacji 3, ale nie znalazłem jej w hibernacji 4.

Część mojego context.xml dla trwałości:

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

Pomóż mi dowiedzieć się, dlaczego próbuje załadować CacheProvider, ponieważ nie mam żadnych ustawień dla tego w context.xml i który jar muszę dodać do mojego projektu. Dzięki!

Fedor Skrynnikov
źródło
czy możesz wysłać plik konfiguracyjny hibernacji?
Cornel Creanga,
Nie mam tego. Może to nieporozumienie i muszę dodać, że zrobiłem dokładnie to, co zostało opisane w książce „Wiosna w akcji 3” w rozdziale „5.4 Integracja Hibernacji z Springiem”. Kiedy to robiłem, miałem problemy z nieobecnymi klasami, które znalazłem w stanie hibernacji, więc dodałem hibernację 4 do mojego projektu. Ale to nie była enouph
Fedor Skrynnikov
1
czy na pewno hibernacja 4 ma taką klasę? Spróbowałbym hibernacji 3.6.x
Bozho,
Nie. Nie znalazłem go w wersji 4. Właściwie to znalazłem, ale w innym pakiecie w ehcache. Ale pytanie brzmi, dlaczego kocur próbuje go załadować? Czy jest to rzeczywiście potrzebne?
Fedor Skrynnikov
To jest przestarzałe z tego, co wiem
Cornel Creanga

Odpowiedzi:

184

Zmień swoją AnnotationSessionFactoryBean na org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) i będziesz gotowy do pracy. AnnotationSessionFactoryBean został zastąpiony przez LocalSessionFactoryBean, ponieważ teraz wykonuje skanowanie ścieżki klas.

Aaron Douglas
źródło
Jakieś inne możliwe pomysły? Wydaje się, że to nic dla mnie nie robi. Czy należy zmienić właściwości?
zod
3
Upewnij się, że zmieniłeś pakiet z hibernate3 na hibernate4 - w obu pakietach istnieje LocalSessionFactoryBean. Jakiej wersji Spring i Hibernate używasz?
Aaron Douglas
11

Może to być spowodowane zmianami wprowadzonymi w Hibernate 4, które nie są zgodne ze wsparciem Spring dla Hibernate. To wydanie mówi o dodaniu oddzielnego pakietu do obsługi hibernacji 4. Będziesz potrzebować do tego wiosny 3.1. Inną opcją jest hibernacja 3, jeśli nie potrzebujesz żadnej konkretnej funkcji wprowadzonej w 4.

gkamal
źródło
Tak. Zdegradowałem z hiberante 4 do wersji 3.6.7 i wszystko zaczęło działać. Dzięki!
Fedor Skrynnikov
1
+1, działa zgodnie z radą twoją i Aarona . (A dokładniej, przeszedłem przez to i napotkałem inne problemy z Hibernate 4.: P) Nawiasem mówiąc, wiosna 3.1 nie jest już w RC (pierwsze wydanie GA w grudniu 2011).
Jonik
thx @gkamal. Zmiana wersji na hibernację 3 zadziałała dla mnie. Rozwiązanie: użyłem programu hibernate -ivilymanager i hibernate-core, obie wersje 3.6.10. Na koniec zobacz mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

aktualizacja AnnotationSessionFactoryBean do hibernate4 działa idealnie. Upewnij się również, że Twój transactionManager również wskazuje na hibernację4,

<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
źródło
0

Naprawdę prostym problemem, który spowoduje ten sam błąd, jest po prostu niezgodność między wersją hibernacji w pom (4. coś) a wersją określoną w konfiguracji spring.

John Lockwood
źródło