title: Spring and hibernate: No Session found for current thread
body: <p>im gettting the following error</p>
  
  <pre><code>org.hibernate.HibernateException: No Session found for current thread
  at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97)
  at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1024)
  at com.fexco.shoptaxfreemobile.service.ProfileService.registerVisitor(ProfileService.java:57)
  at com.fexco.shoptaxfreemobile.controller.ProfileController.registerVisitor(ProfileController.java:91)
  at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
  at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
  at java.lang.reflect.Method.invoke(Method.java:597)
  at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
  at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
  at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:96)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:617)
  at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:578)
  at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
  at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:923)
  at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
  at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
  at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
  at javax.servlet.http.HttpServlet.service(HttpServlet.java:770)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at com.fexco.shoptaxfreemobile.jsonp.JsonpCallbackFilter.doFilter(JsonpCallbackFilter.java:33)
  at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346)
  at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:259)
  at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
  at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
  at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:224)
  at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
  at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
  at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
  at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
  at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:928)
  at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
  at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
  at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:987)
  at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539)
  at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:300)
  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  at java.lang.Thread.run(Thread.java:619)
  </code></pre>
  
  <p>Service class</p>
  
  <pre><code>@Service
  public class ProfileService {
  
      @Resource(name = "mySessionFactory")
      private SessionFactory sessionFactory;
  
      @Autowired
      private ProfileDao profileDao;
  
      private class CountrySorter implements Comparator&lt;Country&gt; {
          @Override
          public int compare(Country country1, Country country2) {
              if ( country1.getId().compareTo(new Long (3)) &lt; 0){
                  return country1.getId().compareTo(country2.getId());
              }
              return country1.getName().compareToIgnoreCase(country2.getName());
          }               
      }
  
      public List&lt;Country&gt; getCountries() {
  
          List&lt;VisitorCountry&gt; visitorCountries = profileDao.getAllCountries();       
  
          List&lt;Country&gt; countries = new ArrayList&lt;Country&gt;();
          for ( VisitorCountry country : visitorCountries){
              countries.add(country.getCountry());
          }
  
          Comparator&lt;Country&gt; comparator = new CountrySorter();       
          Collections.sort(countries, comparator);
  
          return countries;
      }
  
      public RegisterResponse registerVisitor(JsonVisitor visitorDetails){
          Visitor storedVisitor = (Visitor) sessionFactory.getCurrentSession().get(Visitor.class, visitorDetails.getTfscNumber(), LockMode.NONE);
          if ( storedVisitor == null){
              storedVisitor = new Visitor(visitorDetails);
          }else{
              storedVisitor.setVisitorDetails(visitorDetails);    
          }
  
          try{
              sessionFactory.getCurrentSession().saveOrUpdate(storedVisitor);
  
          }catch(Exception ex){
              return new RegisterResponse(false, "Failed To Register Card. Please Try Again Later.", visitorDetails);
          }
  
          return new RegisterResponse(true, "", visitorDetails);
  
      }
  }
  </code></pre>
  
  <p>bit of DAO class</p>
  
  <pre><code>@Service
  @Transactional
  public class ProfileDao {
  
      @Resource(name = "mySessionFactory")
      private SessionFactory sessionFactory;
  
      public List getAllCountries(){
  
          List&lt;VisitorCountry&gt; visitorCountries = sessionFactory.getCurrentSession()
          .getNamedQuery("GET_ALL_COUNTRIES").list();
  
          return visitorCountries;
  
      }
  
      public List&lt;Retailer&gt; getRetailerByRetailerNumber(String retailerNo) {
  
          List&lt;Retailer&gt; retailerByRetailerNumber = sessionFactory.getCurrentSession()
          .getNamedQuery("FindRetailerByRetailerNo").setString("retailerNo", retailerNo).list();
  
          return retailerByRetailerNumber;
      }
  </code></pre>
  
  <p>and i have this in my application-context.xml</p>
  
  <pre><code>&lt;tx:annotation-driven transaction-manager="transactionManager"/&gt;
  
  &lt;bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"&gt;
      &lt;property name="dataSource" ref="myDataSource" /&gt;
      &lt;property name="configLocation" value="classpath:hibernate.cfg.xml" /&gt;
      &lt;property name="hibernateProperties"&gt;
          &lt;value&gt;
              &lt;![CDATA[
          hibernate.show_sql=true
          hibernate.format_sql=true
          hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider
          ]]&gt;
          &lt;/value&gt;
      &lt;/property&gt;
  &lt;/bean&gt;
  </code></pre>
  
  <p>can anyone spot why i am getting the following error?</p>