Сеанс не найден для текущего потока (Spring 4.0.5.RELEASE и Hibernate 4.3.5.Final)

#hibernate-4.x #multi-tenant #spring-4

#hibernate-4.x #многопользовательский #пружина-4

Вопрос:

Я видел несколько похожих вопросов, но ни одно из предложенных решений мне не помогло.

Я переношу свое приложение с Spring 3.0.5.RELEASE на 4.3.5.Final и с Hibernate 3.6.0.Beta2 на 4.3.5.Final. Приложение отлично работало в старых версиях Spring и Hibernate.

Основная причина этого обновления — поддержка многопользовательской работы в нашем приложении с использованием Hibernate 4.

Вот некоторые подробности :

Уровень обслуживания

 @Service("userServiceBean")
public class UserServiceImpl implements UserService {
private static final Logger logger = MyVacationLogger.getLogger(UserServiceImpl.class);

   @Autowired(required=true)
   private UserDAO userDAO;

   @Transactional(readOnly=true, propagation = Propagation.REQUIRED)
   public UserBean validateUser(UserBean userbean) throws MyVacationRuntimeException
   { .... }
}
 

Уровень DAO

 @Repository("UserDAOBean")
public class UserDAOImpl implements UserDAO {

   @Autowired(required=true)
   @Qualifier("commondbSessionFactory")
   private SessionFactory sessFactory;

   @Override
   public UserDTO findUserbyEmail(String email) throws DataAccessException
   {   
      Session sess = sessFactory.getCurrentSession(); << Error Line 
      ....  
   }
}
 

Ошибка

 Caused by: org.hibernate.HibernateException: No Session found for current thread
at     org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:106)
at   org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at com.ellisdon.portal.mv.dao.impl.UserDAOImpl.findUserbyEmail(UserDAOImpl.java:31)
at    com.ellisdon.portal.mv.service.impl.UserServiceImpl.validateUser(UserServiceImpl.java:38)
 

Любая помощь будет принята с благодарностью.

Спасибо, Билал

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

1. Можете ли вы опубликовать полную трассировку стека и конфигурацию xml или java для настройки фабрики сеансов и диспетчера транзакций?

Ответ №1:

После открытия сеанса вне транзакции вам необходимо связать ресурс следующим образом

 session = sessionFactory.openSession();
TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));