【问题标题】:Spring 3.1, Hibernate 4, SessionFactorySpring 3.1,休眠 4,SessionFactory
【发布时间】:2012-01-23 19:16:08
【问题描述】:

这是有效的:

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


编辑
添加了我自己的答案,为我解决了问题。

【问题讨论】:

标签: java hibernate spring


【解决方案1】:

Hibernate 4 移除了已弃用的与CacheProvider 相关的接口和类,转而支持先前发布的与RegionFactory 相关的缓存接口。你可以找到版本4缓存包摘要here,版本3.2缓存包摘要here(刚刚添加RegionFactory接口之前)和版本3.3缓存包摘要here(当RegionFactory是第一个发布)。

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

但是,基于 Spring 3.1 dependencies,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 只有Support for Hibernate 4.x 的以下内容:

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

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

如果您想使用 Hibernate 4,您似乎应该留意一些 other changes

更新 2:刚刚注意到这个问题与 Exception NoClassDefFoundError for CacheProvider 非常相似。

【讨论】:

    【解决方案2】:

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

    来自LocalSessionFactoryBeanjavadoc:

    注意:LocalSessionFactoryBean 的这种变体需要 Hibernate 4.0 或更高版本。它的作用类似于 orm.hibernate3 包中的同名类。然而,在实践中,它更接近 AnnotationSessionFactoryBean,因为它的核心目的是从注解扫描中引导 SessionFactory。

    【讨论】:

    • 我看不到 orm.hibernate4 只有 .hibernate3 你能在这里给出任何见解吗?我已经导入了 hibernate 4... 已解决:确保您也使用 Spring 3.2.4。 3.0.5 太旧了。
    • 我刚接触到这个例子,我希望这对任何人都有帮助baeldung.com/hibernate-4-spring
    【解决方案3】:

    我不得不改变一些事情,我们开始吧:

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

    org.springframework.orm.hibernate4.HibernateTransactionManager;
    

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

    <bean id="sessionFactory"
            class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
    

    【讨论】:

    • 我也做了同样的事,得到了 org.springframework.beans.NotWritablePropertyException: Invalid property 'exposeTransactionAwareSessionFactory' of bean class...
    【解决方案4】:

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

    【讨论】:

    • 报告是关于,Spring 3.x 和 Hibernate 4 不兼容。无法使用 HibernateTemplate。这是因为 Hibernate 4 不再支持 HibernateTemplate。
    【解决方案5】:

    使用此配置

    休眠配置文件:

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

    我忘记包含版本,我使用的是休眠版本:4.1.2.Final 和春季版本:3.1.1.RELEASE,有一个休眠 4.1.3.Final 的更新,未测试但我相信它会工作正常。

    【讨论】:

      【解决方案6】:
      • 对于 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

      【讨论】:

        猜你喜欢
        • 2014-06-24
        • 1970-01-01
        • 1970-01-01
        • 2016-06-28
        • 2014-10-26
        • 2016-03-21
        • 2013-06-11
        • 2015-06-10
        相关资源
        最近更新 更多