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的那個,接着便有上一段的錯誤。java
Stackoverflow,用org.springframework.orm.hibernate4.LocalSessionFactoryBean
替換org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean。web
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.spring
Hibernate4已經把CacheProvider相關的接口和類移除,如今的RegionFactory關聯的緩存接口在二級緩存中可用。express
二者聯繫:
緩存
其實能夠看到:session
java.lang.Object org.springframework.orm.hibernate3.AbstractSessionFactoryBean org.springframework.orm.hibernate3.LocalSessionFactoryBean org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
AnnotationSessionFactoryBean仍是從LocalSessionFactoryBean繼承的。ide
同時還發現了一個問題。聲明式的事務管理中同時加了Annotation和xml也聲明瞭。spa
xml聲明是aop的方式,在方法中切進去。hibernate
<tx:annotation-driven transaction-manager="txManager"/> <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> <tx:advice id="txAdvice" transaction-manager="txManager"> <tx:attributes> <tx:method name="add" read-only="true" /> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut expression="execution (public * com.my.service..*.*(..))" id="servicePointCut" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="servicePointCut"/> </aop:config>
同時service類方法中的annotation也忘記去掉code
@Transactional public void add(User user) { userDAO.save(user); Log log = new Log(); log.setName("output!"); logDAO.save(log); }
xml自己的readonly就失效了,因此二者中選取一種便可。