繁体   English   中英

Spring 3.1,Hibernate 4,SessionFactory

[英]Spring 3.1, Hibernate 4, SessionFactory

这是有效的:

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

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

部署错误是:

嵌套异常是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相关缓存接口。 你可以找到的版本4缓存包摘要这里 ,版本3.2的高速缓存包摘要这里 (在之前RegionFactory加入接口)和3.3版本的缓存包摘要这里 (当RegionFactory首次发布)。

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

但是,基于Spring 3.1 依赖项, Spring 3.1不需要Hibernate 4(在Full Dependencies部分下, JBoss Hibernate Object-Relational Mapper的版本为3.3.2.GA )。 如果要升级到Hibernate 4,则需要更新缓存设置。 否则,请尝试使用Hibernate 3.3.2或更高版本的3.X版本。

更新 :请记住,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 :刚刚注意到这个问题与CacheProvider异常NoClassDefFoundError密切相关。

使用此配置

hibernate配置文件:

<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,有一个hibernate 4.1.3.Final的更新,未经测试但我相信它会正常工作。

我不得不改变一些事情,我们走了:

在我的事务管理器中设置更改3 - > 4:

org.springframework.orm.hibernate4.HibernateTransactionManager;

我的sessionFactory对此(感谢@toxin):

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
  • 在Hibernate 4.0或更高版本的情况下,从Spring 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM