Spring 3.1,Hibernate 4,SessionFactory

Nim*_*sky 42 java spring hibernate

这是有效的:

<bean id="sessionFactory"  
      class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
...
Run Code Online (Sandbox Code Playgroud)

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

部署错误是:

嵌套异常是java.lang.NoClassDefFoundError:Lorg/hibernate/cache/CacheProvider;


编辑
添加了我自己的答案,为我修复了它.

小智 92

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

来自LocalSessionFactoryBeanjavadoc:

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


Dan*_*ruz 15

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
Run Code Online (Sandbox Code Playgroud)

Spring 3.1引入了LocalSessionFactoryBuilder扩展Hibernate的Configuration.

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

更新2:刚刚注意到这个问题与CacheProvider异常NoClassDefFoundError密切相关.


Def*_*rag 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>
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

我忘了包含版本,我使用的是hibernate版本:4.1.2.Final和spring版本:3.1.1.RELEASE,有一个hibernate 4.1.3.Final的更新,未经测试但我相信它会正常工作.


Nim*_*sky 5

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

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

org.springframework.orm.hibernate4.HibernateTransactionManager;
Run Code Online (Sandbox Code Playgroud)

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

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
Run Code Online (Sandbox Code Playgroud)