Spring + Hibernate: для текущего потока сеанс не найден

Spring + Hibernate: сеанс не найден для текущего потока

Интегрируя Spring 3 и Hibernate 4, система показывает следующее сообщение при выполнении операции с базой данных:

org.hibernate.HibernateException: No Session found for current thread

sessionFactory вводится следующим образом:

spring-hibernate4.xml



    

        
        
        
        
    

    
        
        
            
                orm/Users.hbm.xml
            
        
        
            
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            
        
    

    
        
    

    
        
    

Решение

sessionFactory требует, чтобы транзакция работала, для ее решения объявите диспетчер транзакций в Spring.

Solution 1: декларативное управление транзакциями, объявление диспетчера транзакций в XML-файле через Spring AOP.

spring-hibernate4.xml



    

        
        
        
        
    

    
        
        
            
                orm/Users.hbm.xml
            
        
        
            
                hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
            
        
    

    
        
    

    
        
    

    
        
    

    
        
            
            
        
    

    
        
        
    

Solution 2: программное управление транзакциями, объявление диспетчера транзакций в коде.

package com.example.users.service;

//...
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.TransactionStatus;
import org.springframework.transaction.support.TransactionCallback;
import org.springframework.transaction.support.TransactionTemplate;

public class UserServiceImpl implements UserService {

  private UserDao userDao;

  private TransactionTemplate transactionTemplate;

  public void setTransactionManager(PlatformTransactionManager transactionManager) {
    this.transactionTemplate = new TransactionTemplate(transactionManager);
  }

  @Override
  public UserDetails findByUsername(final String username) {

    // Programmatic transaction management
    return transactionTemplate.execute(new TransactionCallback() {

      public UserDetails doInTransaction(TransactionStatus status) {

                UserDetails user = userDao.findByUserName(username);
                //etc etc

      }

    });

  }

Note
Для получения дополнительной информации посетите этотOfficial Spring Transaction Management.