Миграция Spring + Hibernate - исключение метода currentSession()

Я перенес Spring с 3.1 на 4.1.3 и Hibernate 3.2 на 4.3.9.

В рамках миграции я изменил импорт и код ниже

старый импорт

import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

новый импорт

import org.springframework.orm.hibernate4.support.HibernateDaoSupport;

и изменения кода

В спящем режиме 3 у меня есть следующий код

public Session getCurrentSession() {
    Session session = getSession();
    session.setFlushMode(FlushMode.MANUAL);
    return session;
}

теперь я изменил в соответствии с новыми банками, как показано ниже

public Session getCurrentSession() {
    Session session = currentSession();
    session.setFlushMode(FlushMode.MANUAL);
    return session;
    }

после вышеуказанных изменений я получаю исключение ниже

    Could not obtain transaction-synchronized Session for current thread
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
    at org.springframework.orm.hibernate4.support.HibernateDaoSupport.currentSession(HibernateDaoSupport.java:129)

Я не использую аннотации в своем приложении

Я не могу решить проблему. Пожалуйста, помогите мне узнать возможные причины исключения


person Raj    schedule 17.10.2016    source источник
comment
Исправьте настройку транзакции. Это исключение говорит вам, что вы не настроили (правильно) свои транзакции.   -  person M. Deinum    schedule 17.10.2016
comment
@ M.Deinum Я добавил тег ‹tx:annotation-driven/› в свой файл конфигурации, но все еще получаю ту же проблему. мне нужно добавить что-нибудь еще? Пожалуйста подтвердите   -  person Raj    schedule 17.10.2016
comment
Добавление только этого тега без добавления @Transactional практически бесполезно.   -  person M. Deinum    schedule 17.10.2016
comment
@Raj Если вы не используете аннотации в своем проекте. Тогда нет никакой пользы от использования <tx:annotation-driven/>.   -  person gschambial    schedule 17.10.2016
comment
@gschambial да, но я дал след, и это не сработало :)   -  person Raj    schedule 17.10.2016
comment
Я обновил свой ответ. Вы можете это проверить?   -  person gschambial    schedule 17.10.2016
comment
Пожалуйста, обратитесь к http://stackoverflow.com/questions/26203446/spring-hibernate-could-not-obtain-transaction-synchronized-session-for-current   -  person Raman    schedule 17.10.2016


Ответы (1)


Я думаю, вам нужно добавить transactionManager для вашего sesssionFactory:

<bean id="transactionManager"  class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory">
         <ref local="mySessionFactory"/>
    </property>
  </bean>

где mySessionFactory — идентификатор компонента Session Factory.

Как вы сказали, вы не используете аннотации в своем проекте. Затем вы должны использовать AOP, чтобы включить управление транзакциями на уровне метода.

<tx:advice id="txAdvice" transaction-manager="transactionManager">
  <tx:attributes>
    <tx:method name="select*"  read-only="true" />
    <tx:method name="*" />
  </tx:attributes>
</tx:advice>
<aop:config>
  <aop:pointcut id="txPointcut" expression="execution(* example.MyClass.*(..))" />
  <aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>

Добавьте поддержку транзакций для вашего метода, как это.

Добавьте следующую запись в свой POM, если вы используете MAVEN или gradle, или вы можете просто загрузить и добавить jar в свой путь к классам.

<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>
person gschambial    schedule 17.10.2016
comment
Убедитесь, что вы используете org.springframework.orm.hibernate4.HibernateTransactionManager, а не org.springframework.orm.hibernate3.HibernateTransactionManager - person gschambial; 17.10.2016
comment
приложение также не использует aop .. Я могу опубликовать свои данные о tx, если хотите - person Raj; 17.10.2016
comment
@Raj Нет сложной конфигурации для добавления поддержки Transaction AOP. Я обновил ответ для добавления поддержки AOP. - person gschambial; 17.10.2016
comment
@Радж удачи? - person gschambial; 18.10.2016
comment
@ gschambial извините за поздний ответ .. пока не повезло .. есть ли альтернатива, чтобы мы могли избежать аннотаций ?? поскольку текущее приложение не использует аннотации, и я хочу продолжить без аннотаций. или @Transactional обязателен для spring4? - person Raj; 19.10.2016
comment
@Raj Вы можете избежать аннотаций, если добавите поддержку транзакций через XML, как я также объяснил в своем ответе. Если вы выбираете поддержку на основе XML, вам не нужно добавлять аннотации в свой проект для поддержки транзакций. - person gschambial; 19.10.2016
comment
спасибо за ваш ответ. Если я просто изменю метод Spring getSession() на currentSession(), я получу исключение ниже Не удалось получить сеанс, синхронизированный с транзакцией, для текущего потока org.hibernate.HibernateException: Не удалось получить сеанс, синхронизированный с транзакцией, для текущего потока в org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) в org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) в - person Raj; 19.10.2016
comment
Да, я думаю, потому что вам нужно добавить поддержку транзакций. Поэтому я предлагаю вам добавить поддержку вашего метода на основе XML. - person gschambial; 19.10.2016