Spring + Hibernate: Aucune session trouvée pour le fil actuel

Spring + Hibernate: Aucune session trouvée pour le thread actuel

Intègre Spring 3 et Hibernate 4, le système affiche le message suivant lors de l'exécution de l'opération de base de données:

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

LesessionFactory est injecté comme ceci:

spring-hibernate4.xml



    

        
        
        
        
    

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

    
        
    

    
        
    

Solution

LesessionFactory a besoin de transaction pour fonctionner, pour le résoudre, déclarez un gestionnaire de transactions au printemps.

Solution 1: gestion déclarative des transactions, déclaration du gestionnaire de transactions dans un fichier XML, via Spring AOP.

spring-hibernate4.xml



    

        
        
        
        
    

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

    
        
    

    
        
    

    
        
    

    
        
            
            
        
    

    
        
        
    

Solution 2: Gestion des transactions par programmation, déclaration du gestionnaire de transactions dans le code.

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
Pour plus d'informations, veuillez visiter ceOfficial Spring Transaction Management.