Exceção NoClassDefFoundError para CacheProvider

93

Sou meio que novo no Spring e hibernate, então estou tentando implementar algum aplicativo da web simples baseado no Spring 3 + hibernate 4 enquanto inicio o tomcat. Tenho esta exceção:

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)

Descobri que esta classe estava em hibernate-core para hibernate 3, mas não a encontrei em hibernate 4.

A parte do meu context.xml para persistência:

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

Por favor, me ajude a descobrir por que ele está tentando carregar CacheProvider, porque eu não tenho nenhuma configuração para isso em context.xml e qual jar devo adicionar em meu projeto. Obrigado!

Fedor Skrynnikov
fonte
você pode postar o arquivo de configuração do hibernate?
Cornel Creanga
Eu não tenho. Talvez seja um mal-entendido e devo acrescentar que fiz exatamente o que foi descrito no livro "Spring em ação 3" capítulo "5.4 Integrando Hibernate com Spring". Enquanto fazia isso, tive alguns problemas com aulas ausentes que encontrei no hibernate, então adicionei o hibernate 4 ao meu projeto. Mas não foi o suficiente
Fedor Skrynnikov
1
tem certeza que o Hibernate 4 tem essa classe? Eu tentaria hibernar 3.6.x
Bozho
Não. Eu não encontrei na versão 4. Na verdade, eu encontrei, mas em outro pacote no ehcache. Mas a questão é por que o Tomcat tenta carregá-lo? E é realmente necessário?
Fedor Skrynnikov
Pelo que eu sei, está obsoleto
Cornel Creanga,

Respostas:

184

Mude seu AnnotationSessionFactoryBean para org.springframework.orm.hibernate4.LocalSessionFactoryBean(Hibernate 4) e você estará pronto para continuar. O AnnotationSessionFactoryBean foi substituído pelo LocalSessionFactoryBean, pois agora faz a varredura do caminho da classe.

Aaron Douglas
fonte
Alguma outra ideia possível? Isso não parece fazer nada por mim. As propriedades precisam ser alteradas?
zod
3
Certifique-se de ter alterado o pacote de hibernate3 para hibernate4 - um LocalSessionFactoryBean existe em ambos os pacotes. Qual versão do Spring e Hibernate você está usando?
Aaron Douglas
11

Isso pode ser devido a mudanças introduzidas no Hibernate 4 que não são compatíveis com o suporte Spring para Hibernate. Esta edição fala sobre como adicionar um pacote separado para dar suporte ao hibernate 4. Você precisará do Spring 3.1 para isso. A outra opção é manter o modo de hibernação 3 se você não precisar de nenhum recurso específico introduzido no 4.

gkamal
fonte
Sim. Eu fiz downgrade do hiberante 4 para a versão 3.6.7 e tudo começou a funcionar. Obrigado!
Fedor Skrynnikov
1
1, funcionou com o seu conselho e o de Aaron . (Ou mais precisamente, superou isso e se deparou com outros problemas do Hibernate 4.: P) A propósito, o Spring 3.1 não está mais no RC (primeiro lançamento do GA em dezembro de 2011).
Jonik
thx @gkamal. Reduzir a versão para hibernar 3 funcionou para mim. Solução: usei o hibernate-entitymanager e o hibernate-core, ambas as versões 3.6.10.Final, consulte mvnrepository.com/search.html?query=hibernate-entitymanager
Adrien Be
8

atualizar AnnotationSessionFactoryBean para hibernate4 funciona perfeitamente. Certifique-se também de que o transactionManager também aponta para 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
fonte
0

Um problema realmente simples que causará o mesmo erro é simplesmente haver uma incompatibilidade entre a versão de hibernação no pom (4.algo) e a versão especificada na configuração do spring.

John Lockwood
fonte