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

#spring #hibernate #spring-4 #hibernate-4.x

#весна #переход в спящий режим #spring-4 #спящий режим-4.x

Вопрос:

Я перенес 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)
 

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

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

Комментарии:

1. Исправьте настройку транзакции. Это исключение сообщает вам, что вы не (правильно) настроили свои транзакции.

2. @M.Deinum Я добавил тег <tx:аннотации /> в свой конфигурационный файл, но все равно получаю ту же проблему. нужно ли мне добавить что-нибудь еще? Пожалуйста, подтвердите

3. Только добавление этого тега без добавления @Transactional практически бесполезно.

4. @Raj, если вы не используете аннотации в своем проекте. Тогда нет никакой пользы от использования <tx:annotation-driven/> .

5. @gschambial да, но я дал след, и он не сработал 🙂

Ответ №1:

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

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

где, mySessionFactory ваш идентификатор компонента фабрики сеанса.

Как вы сказали, вы не используете аннотации в своем проекте. Затем вы должны использовать 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 в свой classpath.

 <!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>4.3.3.RELEASE</version>
</dependency>
 

Комментарии:

1. Убедитесь, что вы используете org.springframework.orm.hibernate4.HibernateTransactionManager не org.springframework.orm.hibernate3.HibernateTransactionManager

2. приложение также не использует aop.. Я могу опубликовать свои данные о tx, если вы хотите

3. @Raj Не существует сложной конфигурации для добавления поддержки транзакций AOP. Я обновил ответ для добавления поддержки AOP.

4. @Raj есть какие-нибудь успехи?

5. @ gschambial извините за поздний ответ.. пока не повезло .. есть ли какая-либо альтернатива, чтобы мы могли избежать аннотаций?? поскольку текущее приложение не использует аннотации, и я хочу продолжить без аннотаций. или @Transactional является обязательным для spring4?