Spring 3.1,Hibernate 4,SessionFactory

42

这个之前是可以工作的:

<bean id="sessionFactory"  
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
但是升级到上述版本会导致它的故障。如何正确创建一个使用Spring 3.1.ReleaseHibernate 4.0.0.FINALSessionFactory bean呢?
部署时的错误为:
  

nested exception is java.lang.NoClassDefFoundError:   Lorg/hibernate/cache/CacheProvider;

编辑
我已经添加了自己的答案,对我有用。

实际上它已经被弃用了。因此,删除是相当可疑的。http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/cache/CacheProvider.html - Stan Kurilin
6个回答

92
我认为你应该使用org.springframework.orm.hibernate4.LocalSessionFactoryBean而不是org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean 根据LocalSessionFactoryBean的JavaDoc:
注意:这个版本的LocalSessionFactoryBean需要Hibernate 4.0或更高版本。它在作用上类似于orm.hibernate3包中同名的类。但在实践中,它更接近AnnotationSessionFactoryBean,因为它的核心目的是通过注解扫描引导一个SessionFactory。

1
我看不到 orm.hibernate4,只有 .hibernate3,请问您能否提供一些见解?我已经导入了 hibernate 4...已解决:请确保同时使用 Spring 3.2.4,3.0.5 版本太旧了。 - Anders Metnik
1
我刚刚发现了这个例子,希望对任何人有所帮助 http://www.baeldung.com/hibernate-4-spring - Raul Luna

15
Hibernate 4已删除了已弃用的CacheProvider相关接口和类,转而使用之前发布的RegionFactory相关缓存接口。您可以在此处找到版本4缓存包摘要here,版本3.2缓存包摘要here(就在添加RegionFactory接口之前),以及版本3.3缓存包摘要here(当首次发布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文档目前很少。支持Hibernate 4.x只在Spring Framework参考文档中提到以下内容:

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

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

如果您想使用Hibernate 4,则似乎应该留意其他变化

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


8

请使用以下配置:

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的更新,虽然没有经过测试,但我相信它会正常工作。


5

我必须做出一些更改,以下是具体内容:

我在事务管理器的设置中做了更改,从3变为4:

org.springframework.orm.hibernate4.HibernateTransactionManager;

我将我的sessionFactory更新为以下内容(感谢@toxin):

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

我也做了同样的事情,得到了org.springframework.beans.NotWritablePropertyException异常:bean类的属性'exposeTransactionAwareSessionFactory'无效... - masT

0
  • 在 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


-3

2
报告内容是关于Spring 3.x和Hibernate 4不兼容的问题。无法使用HibernateTemplate。这是因为Hibernate 4已经不再支持HibernateTemplate。 - Hemeroc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接