Spring 3.1,Hibernate 4,SessionFactory

这是工作:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> ... 

但升级到上述版本打破了它。 使用Spring 3.1.ReleaseHibernate 4.0.0.FINAL创buildSessionFactory bean的正确方法是什么?

部署错误是:

嵌套的exception是java.lang.NoClassDefFoundError:Lorg / hibernate / cache / CacheProvider;

编辑
已经添加了我自己的答案,这为我解决了。

我认为你应该使用org.springframework.orm.hibernate4.LocalSessionFactoryBean而不是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

LocalSessionFactoryBean javadoc:

注意:LocalSessionFactoryBean的这种变体需要Hibernate 4.0或更高版本。 它与orm.hibernate3包中的同名命名类相似。 但实际上,它更接近AnnotationSessionFactoryBean,因为它的核心目的是从注释扫描引导SessionFactory。

Hibernate 4已经删除了弃用的CacheProvider相关的接口和类,以支持之前发布的RegionFactory相关的caching接口。 您可以在这里find版本4caching包总结, 此处 (仅在添加RegionFactory接口之前)版本3.2caching包总结以及此处的版本3.3caching包总结(当第一次发布RegionFactory时)。

除了JavaDoc之外,您可能会发现以下文档很有用:

  • 使用JBoss Cache作为Hibernate二级caching – 第5章。体系结构
  • Ehcachehibernate二级caching
  • hibernate4 – 二级caching

但是,基于Spring 3.1 依赖关系 Spring 3.1不需要Hibernate 4(在Full Dependencies部分下, JBoss Hibernate Object-Relational Mapper程序在版本3.3.2.GA )。 如果你想升级到Hibernate 4,你需要更新caching设置。 否则,请尝试使用Hibernate 3.3.2或更高版本。

更新 :请记住,Spring 3.1中的Hibernate 4文档目前是稀疏的。 Spring Framework Reference Documentation仅支持Hibernate 4.x :

 See Javadoc for classes within the new org.springframework.orm.hibernate4 package 

Spring 3.1引入了LocalSessionFactoryBuilder ,它扩展了Hibernate的Configuration

如果你想使用Hibernate 4,你应该留意一些其他的改变 。

更新2 :只是注意到这个问题是CacheProviderexceptionNoClassDefFoundError的重复。

使用这个configuration

hibernateconfiguration文件:

 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> </bean> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"> <property name="sessionFactory" ref="sessionFactory" /> </bean> 

POM:

  <!-- CGLIB --> <dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>${cglib-version}</version> <scope>runtime</scope> </dependency> <!-- Hibernate --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>${org.hibernate-version}</version> <!-- will come with Hibernate core --> </dependency> <!-- Spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>${org.springframework-version}</version> </dependency> 

我忘了包括版本,我正在使用hibernate版本:4.1.2.Final和spring的版本:3.1.1.RELEASE,有一个更新的hibernate4.1.3.Final,未经testing,但我相信它会正常工作。

我不得不改变一些东西,我们去了:

在我的事务pipe理器中设置更改了3 – > 4:

 org.springframework.orm.hibernate4.HibernateTransactionManager; 

和我的sessionFactory这个(谢谢@毒素):

 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
  • 在Spring 4.0以上的情况下,你应该使用Hibernate 4.0或更高版本
 org.springframework.orm.hibernate4.LocalSessionFactoryBean 

例如:

 <bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean"> ... </bean> 

请参阅http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBean.html

  • 在Hibernate 5.0 / 5.1 / 5.2的情况下,从Spring 4.3开始,你最好改用它
 org.springframework.orm.hibernate5.LocalSessionFactoryBean 

(请参阅http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate5/LocalSessionFactoryBean.html

Spring 3.1和Hibernate 4在很多方面都不兼容。 请参考下面的Spring JIRA https://jira.springsource.org/browse/SPR-9365