2014-10-03 11 views
6

Otrzymuję następujący wyjątek w projekcie Spring4/Hibernate4, który przekonwertowałem z xml- do Java-Config.Nie można uzyskać sesji zsynchronizowanej z transakcją dla bieżącego wątku

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 

Projekt uruchamia właściwość i errorfree w Eclipse, ale na pierwsze żądanie pojawia się wyjątek. W moim ConfigRoot -class mam @Bean skonfigurowany DataSource, SessionFactory, HibernateTransactionManager, ImprovedNamingStrategy.

Wszystkie moje usługi @Service są opatrzone przypisami z @Transactional.

Każdy pomysł, skąd to może pochodzić?

Edycja 1

Zgodnie z życzeniem, tutaj StackTrace:

 
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) 
    org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
    employees.service.PersonService.getAllInHierarchcalOrder(PersonService.java:58) 
    employees.controller.PersonController.getPersons(PersonController.java:64) 
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    java.lang.reflect.Method.invoke(Method.java:606) 
    org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215) 
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132) 
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:781) 
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:721) 
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:722) 
    org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
    org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
    org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 

Edycja 2

dziwne, pożyczyłem cały kod java-config z innego projektu, który działa bez zarzutu , na pewno brakowało mi szczegółów. Dlatego nie biorę pod uwagę Some transaction propagations not working with Spring/Hibernate 4.

+0

Sprawdź w [SO pytanie] (http://stackoverflow.com/questions/25569365/some-transaction-propagations-not-working-with-spring-hibernate-4). –

+0

Jeśli przynajmniej pokazałeś stacktrace ... –

Odpowiedz

8

właśnie znalazłeś ... @EnableTransactionManagement brakowało w mojej klasie konfiguracji korzeń.

Dziękuję wszystkim za wskazówki.

+0

Do tej pory nie używałam @EnableTransactionManagement. Wszystkie moje warstwy usług i warstwy dao działały dobrze do tej pory. Nagle natrafiłem na ten problem. Co więcej, ten sam dao ma jedną metodę zapisu i działa dobrze. Tylko wtedy, gdy próbuję stworzyć kryteria, daje to problem. Drugi dao nadal działa dobrze. Czy masz jakieś propozycje? –

1

Przypuszczam, że jest to problem transakcyjnej proxy nie są używane (tylko domyślać z stacktrace). Domyślnie sprężyna używa do tego proxy Jdk, ale wymaga to importowania usługi jako interfejsu w kontrolerze.

Jeśli jest to przypadek, tworzenie interfejsu IPersonService zawierający odpowiednie metody z PersonService i zaimportować go w PersonController jako @Autowired IPersonService personService; lub nawet lepiej, zmiana nazwy PersonService do PersonServiceImpl i uczynić PersonService interfejsu.

... I konsekwentnie zrobić dla wszystkich usług transakcyjnych ...

0

Taki scenariusz:

Użyj tego Thumb Zasada:

1) dla każdego @Entity @Table (name = "Tabela1")

Tworzenie odpowiednie usługi, i odpowiadająca DAO.

Powiązane problemy