Spring Hibernate: Keine Sitzung für aktuellen Thread gefunden

Frühling + Ruhezustand: Für den aktuellen Thread wurde keine Sitzung gefunden

Integriert Spring 3 und Hibernate 4, zeigt das System beim Ausführen des Datenbankvorgangs die folgende Meldung an:

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

DassessionFactory wird wie folgt injiziert:

spring-hibernate4.xml



    

        
        
        
        
    

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

    
        
    

    
        
    

Lösung

DiesessionFactory benötigen eine Transaktion, um zu funktionieren. Um sie zu lösen, deklarieren Sie im Frühjahr einen Transaktionsmanager.

Solution 1: Deklaratives Transaktionsmanagement, deklarieren Sie den Transaktionsmanager in einer XML-Datei über Spring AOP.

spring-hibernate4.xml



    

        
        
        
        
    

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

    
        
    

    
        
    

    
        
    

    
        
            
            
        
    

    
        
        
    

Solution 2: Programmatisches Transaktionsmanagement, deklarieren Sie den Transaktionsmanager im 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
Weitere Informationen finden Sie unterOfficial Spring Transaction Management.