Весна и hibernate: сеанс не найден для текущей темы

im получить следующую ошибку

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 { @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 getCountries() { List visitorCountries = profileDao.getAllCountries(); List countries = new ArrayList(); for ( VisitorCountry country : visitorCountries){ countries.add(country.getCountry()); } Comparator 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); } } 

бит classа DAO

 @Service @Transactional public class ProfileDao { @Resource(name = "mySessionFactory") private SessionFactory sessionFactory; public List getAllCountries(){ List visitorCountries = sessionFactory.getCurrentSession() .getNamedQuery("GET_ALL_COUNTRIES").list(); return visitorCountries; } public List getRetailerByRetailerNumber(String retailerNo) { List retailerByRetailerNumber = sessionFactory.getCurrentSession() .getNamedQuery("FindRetailerByRetailerNo").setString("retailerNo", retailerNo).list(); return retailerByRetailerNumber; } 

и у меня это в моем приложении-context.xml

           

кто-нибудь может понять, почему я получаю следующую ошибку?

Вы аннотировали свой class Dao @Transactional, но не ваш class обслуживания. Линия:

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

требует, чтобы вы были в транзакции.

Вы можете исправить это, добавив аннотацию @Transactional в свой class ProfileService или просто метод registerVisitor ().

Я решил ту же проблему, выполнив следующие два шага

  1. Размещено @Transactional по методу службы, как предложено jordan002 в его ответе на этой странице.

  2. Еще одна вещь: если у вас есть два файла конфигурации: скажем, application-context.xml (для конкретной конфигурации контекста и контекста приложения) и webmvc-context.xml (для конкретной конфигурации веб- webmvc-context.xml ), вы должны сканировать пакеты, отличающиеся для вашего controllerов и дао.

    webmvc-context.xml загружается после application-context.xml . Я думаю, что class DAO загружается сначала с транзакционными ссылками при загрузке приложения-context.xml, но он заменяется другим объектом, без ссылок на транзакции, когда загружается webmvc-context.xml.

    В любом случае, я разрешаю проблему с проверенными пакетами:

      

    для application-context.xml

    а также

      

    для webmvc-context.xml .

измените аннотацию DAO на @Repository

 @Repository public class ProfileDao { . . . } 

а затем, например, сделать ваш метод обслуживания @Transactional

 @Transactional public List getRetailerByRetailerNumber(String retailerNo) {} 

Я решил эту проблему, выполнив два шага

1-Добавление поддержки @Transactional в моем методе обслуживания, который вызывает методы DAO

2 – Импортируя applicationContext.xml в spring-servlet.xml таким образом

             

Он устраняет необходимость сканирования пакетов в двух местах: spring-servlet.xml и applicationContext.xml

Я знаю, что это вопрос с некоторым возрастом, но я столкнулся с этой проблемой и обнаружил, что, если вы используете конфигурацию Spring-Java, у этой резолюции было несколько частей. Важное значение имеет относительное размещение некоторой конфигурации controllerа.

Во-первых, 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е мне пришлось установить

 @Controller @RequestMapping public class ScheduleController { private static Logger logger = LoggerFactory.getLogger(ScheduleController.class); private WarehouseDAO wrhsDao; @RenderMapping @RequestMapping("VIEW") public String viewSchedule(Map modelMap){...} public void setWrhsDao(WarehouseDAO wrhsDao) { this.wrhsDao = wrhsDao; } } 

У WarehouseDAO есть аннотация @Repository, и SessionFactory не был Autowired.

Надеюсь, это поможет кому-то еще с подобными вопросами.

Я просто добавлю что-то, что заняло у меня некоторое время для отладки: не забывайте, что аннотация @Transactional будет работать только на «общедоступных» методах.

Я положил некоторый @Transactional на «защищенные» и получил эту ошибку.

Надеюсь, поможет 🙂

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

Видимость метода и @Transactional

При использовании прокси следует применять аннотацию @Transactional только к методам с общедоступной видимостью. Если вы аннотируете защищенные, частные или видимые с помощью пакета методы с аннотацией @Transactional, ошибка не возникает, но в аннотированном методе не отображаются настроенные параметры транзакции. Рассмотрите возможность использования AspectJ (см. Ниже), если вам нужно аннотировать непубличные методы.

Давайте будем гением компьютера.