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:宣言型トランザクション管理。SpringAOPを介してXMLファイルでトランザクションマネージャーを宣言します。

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にアクセスしてください。