2012-04-24 14 views
20

im निम्न त्रुटि getttingस्प्रिंग और हाइबरनेट: नहीं सत्र वर्तमान थ्रेड के लिए पाया

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) 

सेवा वर्ग

@Service 
public class ProfileService { 

    @Resource(name = "mySessionFactory") 
    private SessionFactory sessionFactory; 

    @Autowired 
    private ProfileDao profileDao; 

    private class CountrySorter implements Comparator<Country> { 
     @Override 
     public int compare(Country country1, Country country2) { 
      if (country1.getId().compareTo(new Long (3)) < 0){ 
       return country1.getId().compareTo(country2.getId()); 
      } 
      return country1.getName().compareToIgnoreCase(country2.getName()); 
     }    
    } 

    public List<Country> getCountries() { 

     List<VisitorCountry> visitorCountries = profileDao.getAllCountries();  

     List<Country> countries = new ArrayList<Country>(); 
     for (VisitorCountry country : visitorCountries){ 
      countries.add(country.getCountry()); 
     } 

     Comparator<Country> 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); 

    } 
} 

डीएओ वर्ग के बिट

@Service 
@Transactional 
public class ProfileDao { 

    @Resource(name = "mySessionFactory") 
    private SessionFactory sessionFactory; 

    public List getAllCountries(){ 

     List<VisitorCountry> visitorCountries = sessionFactory.getCurrentSession() 
     .getNamedQuery("GET_ALL_COUNTRIES").list(); 

     return visitorCountries; 

    } 

    public List<Retailer> getRetailerByRetailerNumber(String retailerNo) { 

     List<Retailer> retailerByRetailerNumber = sessionFactory.getCurrentSession() 
     .getNamedQuery("FindRetailerByRetailerNo").setString("retailerNo", retailerNo).list(); 

     return retailerByRetailerNumber; 
    } 

और मैं में इस राशि अपने आवेदन-context.xml

<tx:annotation-driven transaction-manager="transactionManager"/> 

<bean id="mySessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="myDataSource" /> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml" /> 
    <property name="hibernateProperties"> 
     <value> 
      <![CDATA[ 
     hibernate.show_sql=true 
     hibernate.format_sql=true 
     hibernate.cache.provider_class=org.hibernate.cache.NoCacheProvider 
     ]]> 
     </value> 
    </property> 
</bean> 

किसी को भी देखा जा सकता है मैं क्यों निम्न त्रुटि मिल रहा है?

+0

jordan002 का जवाब सही है, लेकिन "असली" समस्या यह है कि बजाय आपकी सेवा में डीएओ बुला, आप सेवा वर्ग से डीबी तक पहुँच रहे हैं की, है ... दूसरी ओर आम तौर पर आप केवल डीएओ विधियों के बजाय लेनदेन के व्यवहार के लिए सेवा विधि चाहते हैं - यदि आपके पास सेवा विधि में 2 अपडेट हैं और दूसरा विफल रहता है, तो लेनदेन आपको डीबी को लगातार रखने में मदद नहीं करता है (लेकिन यह आपके व्यावसायिक तर्क पर निर्भर करता है) । – Betlista

उत्तर

40

आप @Transactional के साथ अपने दाव वर्ग उसकी व्याख्या, लेकिन नहीं आपकी सेवा वर्ग। रेखा:

Visitor storedVisitor = 
    (Visitor) sessionFactory.getCurrentSession().get(Visitor.class, 
      visitorDetails.getTfscNumber(), LockMode.NONE); 

आपको लेनदेन में होना आवश्यक है।

आप अपनी प्रोफ़ाइल सेवा कक्षा में, या केवल रजिस्टर विज़िटर() विधि में @ ट्रांसेक्शनल एनोटेशन जोड़कर इसे ठीक कर सकते हैं।

+0

यह आगे जाता है और अद्यतन/हटाए जाने के लिए हाइबरनेट प्राप्त करने में मदद करता है। – iowatiger08

5

परिवर्तन आपके डीएओ की @Repository

@Repository 
public class ProfileDao { 
. 
. 
. 
} 

और उसके बाद के साथ टिप्पणी कर इस

@Transactional 
public List<Retailer> getRetailerByRetailerNumber(String retailerNo) {} 
9

मैं निम्नलिखित 2 के साथ एक ही समस्या हल की तरह आपकी सेवा विधि उदाहरण के लिए @Transactional कदम

  1. @Transactional सेवा विधि पर jordan002 इस पृष्ठ पर अपने जवाब में

  2. एक और बात, आप 2 विन्यास फाइल है: कहते हैं कि application-context.xml और webmvc-context.xml (DB और आवेदन संदर्भ विशिष्ट विन्यास के लिए) (वेब ​​/ नियंत्रक विशिष्ट विन्यास के लिए), तो आप संकुल अलग के लिए स्कैन करना चाहिए अपने नियंत्रकों और दाव।

    webmvc-context.xmlapplication-context.xml के बाद भरी हुई है। मुझे लगता है कि डीएओ वर्ग लेन-देन संबंधी संदर्भ जब आवेदन-context.xml भरी हुई है के साथ पहली बार भरी हुई है, लेकिन यह,, किसी अन्य वस्तु के साथ बदलें है व्यवहार के संदर्भ के बिना जब webmvc-context.xml भरी हुई है।

    किसी भी तरह से, मैं विशिष्ट संकुल स्कैन किया साथ समस्या का समाधान:

    <context:component-scan base-package="com.app.repository" /> 
    

    application-context.xml के लिए

    और

    <context:component-scan base-package="com.app.web" /> 
    

    webmvc-context.xml के लिए।

1

मैं जानता हूँ कि यह कुछ उम्र के साथ एक सवाल है, लेकिन मैं इस मुद्दे में पड़ गए और पाया आप वसंत-जावा विन्यास का उपयोग कर रहे हैं, कि एक प्रस्ताव यह करने के लिए एक जोड़े भागों था। नियंत्रक को कुछ विन्यास का सापेक्ष प्लेसमेंट महत्वपूर्ण था।

पहले, CoreConfiguration

@Configuration 
public class CoreConfiguration { 
@Bean   
public LocalSessionFactoryBean sessionFactory() { 
    LocalSessionFactoryBean factoryBean = new org.springframework.orm.hibernate4.LocalSessionFactoryBean(); 
    String annotatedPckgs[] ={"org.tigersndragons.reports.model.warehouse"}; 
    factoryBean.setAnnotatedPackages(annotatedPckgs);   
    Properties hibernateProperties = new Properties(); 
    try { 
     hibernateProperties.load(this.getClass().getResourceAsStream("props/hibernate.properties"));   
     factoryBean.setHibernateProperties(hibernateProperties); 
    } catch (IOException e) { } 
    factoryBean.setPackagesToScan("org.telligen.reports.model.warehouse"); 
    factoryBean.setDataSource(warehouseDataSource());//("jdbc/warehouse"); 
    try { 
     factoryBean.afterPropertiesSet(); 
    } catch (IOException e) {  } 
    return factoryBean; 
} 
@Bean 
public WarehouseDAO getWarehouseDAO(){ 
    WarehouseDAO wrhsDao = new WarehouseDAO(); 
    wrhsDao.setSessionFactory(sessionFactory().getObject()); 
    return wrhsDao; 
} 

...

@Configuration 
public class ScheduleConfiguration { 
private static Logger logger = LoggerFactory.getLogger(ScheduleConfiguration.class); 

@Autowired 
private CoreConfiguration coreConfiguration; 


@Bean 
public HandlerMapping handlerMapping(){ 
    DefaultAnnotationHandlerMapping mapping = new DefaultAnnotationHandlerMapping(); 
    mapping.setInterceptors(new Object []{coreConfiguration.openSessionViewInterceptor()}); 
    return mapping; 
} 

@Bean 
public HandlerAdapter handerAdapter(){ 
    return new AnnotationMethodHandlerAdapter(); 
} 

@Bean 
public ScheduleController scheduleController() throws Exception{ 
    ScheduleController controller = new ScheduleController(); 
     controller.setWrhsDao(coreConfiguration.getWarehouseDAO()); 
    return controller; 
} 

... 

नियंत्रक में, मैं

@Controller 
@RequestMapping 
public class ScheduleController { 
private static Logger logger = LoggerFactory.getLogger(ScheduleController.class); 

private WarehouseDAO wrhsDao; 
    @RenderMapping 
@RequestMapping("VIEW") 
public String viewSchedule(Map<String, Object> modelMap){...} 

public void setWrhsDao(WarehouseDAO wrhsDao) { 
    this.wrhsDao = wrhsDao; 
} 
} 

स्थापित करने के लिए WarehouseDAO @Repository एनोटेशन और SessionFactory है था स्वचालित नहीं था।

आशा है कि यह किसी अन्य प्रश्न के समान किसी अन्य व्यक्ति की सहायता करे।

0

मैं सिर्फ कुछ है कि मुझे डिबग करने के लिए कुछ समय लिया जोड़ देंगे: भूल नहीं है कि एक @Transactional एनोटेशन केवल "सार्वजनिक" तरीकों पर काम करेंगे।

मैं "संरक्षित" लोगों पर कुछ @Transactional रख दिया और यह त्रुटि हुई।

आशा है कि यह :)

http://docs.spring.io/spring/docs/3.1.0.M2/spring-framework-reference/html/transaction.html

विधि दृश्यता में मदद करता है और @Transactional

प्रॉक्सी का उपयोग करते समय, आप केवल सार्वजनिक दृश्यता के साथ तरीकों के @Transactional एनोटेशन लागू करना चाहिए। आप सुरक्षित एनोटेट करते हैं, @Transactional टिप्पणी के साथ निजी या पैकेज दृश्य तरीकों, कोई त्रुटि उठाया है, लेकिन एनोटेट विधि कॉन्फ़िगर किया गया व्यवहार सेटिंग्स प्रदर्शन नहीं करता। यदि आपको गैर-सार्वजनिक तरीकों को एनोटेट करने की आवश्यकता है तो AspectJ के उपयोग पर विचार करें (नीचे देखें)।

2

मैं दो कदम

1-जोड़ना मेरी सेवा विधि में @Transactional समर्थन जो बुला रहा है डीएओ तरीकों

का पालन करते हुए ऊपर समस्या हल वसंत-सर्वलेट में applicationContext.xml का आयात 2-तक इस तरह से .xml

<import resource="applicationContext.xml" /> 

<mvc:annotation-driven /> 
<context:component-scan base-package="com.json.api.*" /> 
<!--Third Party Integration should be injected in xml start here --> 
    <bean id="integrationInterface" class="com.json.api.IntegerationInterface"></bean> 
<!--Third Party Integration should be injected in xml start here --> 
<mvc:interceptors> 
    <bean id="apiServiceInterceptor" class="com.json.api.interceptor.ApiServiceInterceptor"></bean> 
</mvc:interceptors> 
<!--To Enable @Value to map key with provided fields for property files --> 
<context:property-placeholder /> 

यह पैक स्कैन करने के लिए की जरूरत को हटा दो स्थानों पर वसंत-servlet.xml और applicationContext.xml में उम्र

संबंधित मुद्दे