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