Pengecualian NoClassDefFoundError untuk CacheProvider

93

Saya agak baru di Spring dan hibernate jadi saya mencoba menerapkan beberapa aplikasi web sederhana berdasarkan Spring 3 + hibernate 4 sementara saya memulai tomcat, saya memiliki pengecualian ini:

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)

Saya telah menemukan bahwa kelas ini dalam hibernate-core untuk hibernate 3 tetapi saya tidak menemukannya di hibernate 4.

Bagian dari context.xml saya untuk ketekunan:

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

Tolong bantu saya untuk mencari tahu mengapa itu mencoba memuat CacheProvider karena saya tidak memiliki pengaturan untuk itu di context.xml dan jar mana yang harus saya tambahkan dalam proyek saya. Terima kasih!

Fedor Skrynnikov
sumber
dapatkah Anda memposting file konfigurasi hibernasi?
Cornel Creanga
Saya tidak memilikinya. Mungkin ini kesalahpahaman dan saya harus menambahkan bahwa saya melakukan persis seperti yang dijelaskan dalam buku "Spring in action 3" bab "5.4 Mengintegrasikan Hibernasi dengan Musim Semi". Ketika saya melakukan itu, saya memiliki beberapa masalah dengan kelas absen yang saya temukan di hibernate, jadi saya menambahkan hibernate 4 ke dalam proyek saya. Tapi itu bukan enouph
Fedor Skrynnikov
1
apakah Anda yakin hibernate 4 memiliki kelas itu? Saya akan mencoba hibernate 3.6.x
Bozho
Tidak. Saya belum menemukannya di versi 4. Sebenarnya, saya sudah menemukannya tetapi di paket lain di ehcache. Tapi pertanyaannya adalah mengapa tomcat mencoba memuatnya? Dan apakah itu benar-benar dibutuhkan?
Fedor Skrynnikov
Ini tidak berlaku lagi dari apa yang saya tahu
Cornel Creanga

Jawaban:

184

Ubah AnnotationSessionFactoryBean Anda menjadi org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) dan Anda akan baik-baik saja. AnnotationSessionFactoryBean diganti dengan LocalSessionFactoryBean seperti yang dilakukan pemindaian jalur kelas sekarang.

Aaron Douglas
sumber
Ada ide lain yang mungkin? Ini sepertinya tidak melakukan apa-apa untuk saya. Apakah properti perlu diubah?
zod
3
Pastikan Anda telah mengubah paket dari hibernate3 ke hibernate4 - LocalSessionFactoryBean ada di kedua paket. Versi Spring dan Hibernate apa yang Anda gunakan?
Aaron Douglas
11

Ini mungkin karena perubahan yang diperkenalkan dalam Hibernate 4 yang tidak kompatibel dengan dukungan Spring untuk Hibernate. Masalah ini berbicara tentang menambahkan paket terpisah untuk mendukung hibernate 4. Anda memerlukan spring 3.1 untuk ini. Opsi lainnya adalah tetap menggunakan hibernasi 3 jika Anda tidak memerlukan fitur khusus apa pun yang diperkenalkan di 4.

gkamal
sumber
Iya. Saya telah menurunkan dari hiberante 4 ke versi 3.6.7 dan semuanya berfungsi. Terima kasih!
Fedor Skrynnikov
1
+1, membuatnya berfungsi dengan saran Anda dan Aaron . (Atau lebih tepatnya, melewati ini dan mengalami masalah Hibernate 4 lainnya.: P) Ngomong-ngomong, Spring 3.1 tidak lagi ada di RC (rilis GA pertama pada Desember 2011).
Jonik
thx @gkamal. Menurunkan versi ke hibernasi 3 berhasil untuk saya. Solusi: Saya menggunakan hibernate-entitymanager dan hibernate-core, keduanya versi 3.6.10. Terakhir lihat mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

memperbarui AnnotationSessionFactoryBean ke hibernate4 berfungsi sempurna. Pastikan juga transactionManager Anda juga mengarah ke 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
sumber
0

Masalah yang sangat sederhana yang akan menyebabkan kesalahan yang sama adalah adanya ketidaksesuaian antara versi hibernate di pom (4.something) dan versi yang ditentukan dalam konfigurasi pegas.

John Lockwood
sumber