web-dev-qa-db-fra.com

Spring 3.1, Hibernate 4, SessionFactory

Cela fonctionnait:

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

mais la mise à niveau vers les versions susmentionnées l'interrompt. Quelle est la bonne méthode pour créer un bean SessionFactory avec Spring 3.1.Release et Hibernate 4.0.0.FINAL ?

L'erreur sur le déploiement est:

l'exception imbriquée est Java.lang.NoClassDefFoundError: Lorg/hibernate/cache/CacheProvider;


[~ # ~] modifier [~ # ~]
J'ai ajouté ma propre réponse, qui l'a corrigée pour moi.

42
NimChimpsky

Je pense que vous devriez utiliser org.springframework.orm.hibernate4.LocalSessionFactoryBean au lieu de org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

De LocalSessionFactoryBean javadoc:

REMARQUE: cette variante de LocalSessionFactoryBean nécessite Hibernate 4.0 ou supérieur. Son rôle est similaire à celui de la classe portant le même nom dans le package orm.hibernate3. Cependant, en pratique, il est plus proche de AnnotationSessionFactoryBean car son objectif principal est de bootstrap un SessionFactory à partir de l'analyse des annotations.

92
qnox

Hibernate 4 a supprimé les interfaces et classes obsolètes liées à CacheProvider au profit de l'interface de cache liée à RegionFactory précédemment publiée. Vous pouvez trouver le résumé du package de cache de la version 4 ici , le résumé du package de cache de la version 3.2 ici (juste avant l'ajout de l'interface RegionFactory) et la version 3.3 résumé du package de cache ici (quand RegionFactory a été publié pour la première fois).

Outre JavaDoc, la documentation suivante peut vous être utile:

Cependant, basé sur Spring 3.1 dépendances Spring 3.1 ne nécessite pas Hibernate 4 (sous le Full Dependencies section, JBoss Hibernate Object-Relational Mapper est à la version 3.3.2.GA). Si vous souhaitez mettre à niveau vers Hibernate 4, vous devrez mettre à jour vos paramètres de cache. Sinon, essayez plutôt d'utiliser Hibernate 3.3.2 ou une version 3.X supérieure.

[~ # ~] mise à jour [~ # ~] : Gardez à l'esprit que la documentation d'Hibernate 4 dans Spring 3.1 est actuellement rare. Le Spring Framework Reference Documentation n'a que les éléments suivants pour Prise en charge d'Hibernate 4.x :

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

Spring 3.1 présente le LocalSessionFactoryBuilder , qui étend le Configuration d'Hibernate.

Il semblerait que vous devriez garder un œil sur certains autres changements si vous souhaitez utiliser Hibernate 4.

MISE À JOUR 2 : Je viens de remarquer que cette question est un double proche de Exception NoClassDefFoundError pour CacheProvider .

15
Dan Cruz

Utilisez cette configuration

fichier de configuration d'hibernation:

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

j'ai oublié d'inclure les versions, j'utilise la version hibernate: 4.1.2.Version finale et printemps: 3.1.1.RELEASE, il y a une mise à jour de l'hibernate 4.1.3.Final, non testé mais je pense que cela fonctionnera bien.

8
Defrag

J'ai dû changer deux ou trois choses, c'est parti:

Dans mon gestionnaire de transactions, la configuration a changé 3 -> 4:

org.springframework.orm.hibernate4.HibernateTransactionManager;

Et ma sessionFactory à cela (merci @toxin):

<bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"
5
NimChimpsky
  • Dans le cas d'Hibernate 4.0 ou supérieur, à partir de Spring 4.0, vous devez utiliser
org.springframework.orm.hibernate4.LocalSessionFactoryBean

Par exemple:

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

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

  • Dans le cas d'Hibernate 5.0/5.1/5.2, à partir du printemps 4.3, vous devriez plutôt utiliser
org.springframework.orm.hibernate5.LocalSessionFactoryBean

(Voir http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/orm/hibernate5/LocalSessionFactoryBean.html )

0
Yuci