Hibernate4与Spring3整合问题之NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider



Hibernate4与Spring3整合问题之NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider。

Spring3与Hibernate4整合时出现了nested exception is java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider。

Hibernate3的时候,用spring来控制sessionfactory用的可以是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean,因为用的是hibernate4所以照猫画虎写了个org.springframework.orm.hibernate4.annotation.AnnotationSessionFactoryBean,发现没有这个类。那继续用hibernate3的那个,接着便有上一段的错误。

 

Stackoverflow,用org.springframework.orm.hibernate4.LocalSessionFactoryBean
替换org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean。

 

In the Hibernate 4 the CacheProvider-related interfaces and classes has been removed. Now the RegionFactory related cache interfaces are available for secondary level caching.

 

Hibernate4已经把CacheProvider相关的接口和类移除,现在的RegionFactory关联的缓存接口在二级缓存中可用。

 

两者联系:

其实可以看到:

 

java.lang.Object
  extended by org.springframework.orm.hibernate3.AbstractSessionFactoryBean
      extended by org.springframework.orm.hibernate3.LocalSessionFactoryBean
          extended by org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean


 

 

AnnotationSessionFactoryBean还是从LocalSessionFactoryBean继承的。

 

同时还发现了一个问题。声明式的事务管理中同时加了Annotation和xml也声明了。

xml声明是aop的方式,在方法中切进去。

 

  1. <tx:annotation-driven transaction-manager=”txManager”/>
  2.     <bean id=”txManager” class=”org.springframework.orm.hibernate4.HibernateTransactionManager”>
  3.       <property name=”sessionFactory” ref=”sessionFactory” />
  4.     </bean>
  5.      <tx:advice id=”txAdvice” transaction-manager=”txManager”>
  6.         <tx:attributes>
  7.           <tx:method name=”add”  read-only=”true” />
  8.         </tx:attributes>
  9.       </tx:advice>
  10.     <aop:config>
  11.         <aop:pointcut
  12.             expression=”execution (public * com.my.service..*.*(..))”
  13.             id=”servicePointCut” />
  14.         <aop:advisor
  15.         advice-ref=”txAdvice”
  16.         pointcut-ref=”servicePointCut”/>
  17.     </aop:config>

同时service类方法中的annotation也忘记去掉 

 

  1. @Transactional
  2. public void add(User user) {
  3.         userDAO.save(user);
  4.         Log log = new Log();
  5.         log.setName(“output!”);
  6.         logDAO.save(log);
  7. }

xml本身的readonly就失效了,所以两者中选取一种即可。
 

 

原文:http://www.roseindia.net/hibernate/hibernate4/Hibernate-4-AnnotationSessionFactoryBean.shtml

帖子:http://stackoverflow.com/questions/8565051/spring-3-1-hibernate-4-sessionfactory