2011-12-19 5 views
42

Это работает:Spring 3.1, Hibernate 4, SessionFactory

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

но обновление до вышеупомянутых версий разбивает его. Каков правильный метод создания бобов SessionFactory с Весна 3.1.Отгрузка и Hibernate 4.0.0.FINAL?

Ошибка на развертывании является:

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


EDIT
Добавили свой ответ, который установил ее для меня.

+0

На самом деле это было устаревшим. Так что удаление довольно подозрительно http://docs.jboss.org/hibernate/core/3.3/api/org/hibernate/cache/CacheProvider.html –

ответ

91

Я думаю, вы должны использовать org.springframework.orm.hibernate4.LocalSessionFactoryBean вместо org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean

От LocalSessionFactoryBean Javadoc:

NOTE: This variant of LocalSessionFactoryBean requires Hibernate 4.0 or higher. It is similar in role to the same-named class in the orm.hibernate3 package. However, in practice, it is closer to AnnotationSessionFactoryBean since its core purpose is to bootstrap a SessionFactory from annotation scanning.

+1

Я не вижу, что orm.hibernate4 только .hibernate3 вы могли бы дать проницательность здесь? Я импортировал hibernate 4 ... Решенный: убедитесь, что вы используете Spring 3.2.4. 3.0.5 слишком стар. –

+1

Я только что наткнулся на этот пример, надеюсь, это может помочь кому-то http://www.baeldung.com/hibernate-4-spring –

15

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.

ОБНОВЛЕНИЕ: Имейте ввиду, что документация Hibernate 4 весной 3.1 в настоящее время разрежена. 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.

Казалось бы, вы должны следить за какой-то other changes если вы хотите использовать Hibernate 4.

UPDATE 2: Просто заметил этот вопрос близкий дубликат Exception NoClassDefFoundError for CacheProvider.

5

мне пришлось изменить несколько вещей, здесь мы идем:

В моем менеджере транзакций изменено 3 -> 4:

org.springframework.orm.hibernate4.HibernateTransactionManager; 

И мой SessionFactory к этому (спасибо @toxin):

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

Я сделал тот же самый сэр и получил org.springframework.beans.NotWritablePropertyException: Недействительный свойство «exposeTransactionAwareSessionFactory» класса bean ... – masT

-3

Spring 3.1 и Hibernate 4 не совместимы во многих отношениях. Пожалуйста, обратитесь весной следующего года JIRA https://jira.springsource.org/browse/SPR-9365

+2

В отчете рассказывается, что Spring 3.x и Hibernate 4 несовместимы. Невозможно использовать HibernateTemplate. Это связано с тем, что HibernateTemplate больше не поддерживается Hibernate 4. – Hemeroc

8

Используйте эту конфигурацию файла конфигурации

гибернации:

<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. Исходная и весенняя версия: 3.1.1.RELEASE, есть обновление спящего режима 4.1.3. Final, не проверено, но я считаю, что он будет работать нормально.

0
  • В случае Hibernate 4.0 или выше, с весны 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, с весны 4.3, вы должны лучше использовать вместо
org.springframework.orm.hibernate5.LocalSessionFactoryBean 

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

Смежные вопросы