복붙노트

[SPRING] 현재 스레드에 대한 트랜잭션 동기화 세션을 얻을 수 없습니다

SPRING

현재 스레드에 대한 트랜잭션 동기화 세션을 얻을 수 없습니다

xml-에서 Java-Config로 변환 된 Spring4 / Hibernate4 프로젝트에서 다음과 같은 예외가 발생합니다.

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

프로젝트는 Eclipse에서 속성을 시작하고 오류가 없지만 처음 요청하면 예외가 나타납니다. 내 ConfigRoot 클래스에는 DataSource, SessionFactory, HibernateTransactionManager, EnhancedNamingStrategy에 대해 @Bean이 구성되어 있습니다.

모든 @Service 서비스에는 @Transactional이 주석으로 표시됩니다.

이것이 어디에서 오는지 아십니까?

편집 1

요청에 따라 여기에서 스택 추적 :

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)

편집 2

이상하게도, 나는 완벽하게 작동하는 다른 프로젝트에서 전체 Java 구성 코드를 빌 렸습니다. 확실히 세부 사항을 놓쳤습니다. 이것이 Spring / Hibernate 4에서 작동하지 않는 일부 트랜잭션 전파를 고려하지 않는 이유입니다.

해결법

  1. ==============================

    1.방금 찾았습니다 ... 루트 구성 클래스에서 @EnableTransactionManagement가 누락되었습니다.

    방금 찾았습니다 ... 루트 구성 클래스에서 @EnableTransactionManagement가 누락되었습니다.

    지도 해 주셔서 감사합니다.

  2. ==============================

    2.트랜잭션 프록시가 사용되지 않는 문제라고 생각합니다 (스택 추적에서 추측). 기본적으로 스프링은 Jdk 프록시를 사용하지만 컨트롤러에서 인터페이스로 서비스를 가져와야합니다.

    트랜잭션 프록시가 사용되지 않는 문제라고 생각합니다 (스택 추적에서 추측). 기본적으로 스프링은 Jdk 프록시를 사용하지만 컨트롤러에서 인터페이스로 서비스를 가져와야합니다.

    이 경우 PersonService의 관련 메소드를 포함하는 인터페이스 IPersonService를 작성하고 PersonController에서 @Autowired IPersonService personService로 가져 오십시오. 또는 PersonService를 PersonServiceImpl로 이름을 바꾸고 PersonService를 인터페이스로 만드십시오.

    그리고 ... 일관되게 모든 거래 서비스에 대해 ...

  3. ==============================

    3.이러한 시나리오 :

    이러한 시나리오 :

    이 Thumb Rule을 사용하십시오.

    1) 모든 @Entity에 대해 @Table (이름 = "Table1")

    해당 서비스 및 해당 DAO를 작성하십시오.

  4. from https://stackoverflow.com/questions/26179159/could-not-obtain-transaction-synchronized-session-for-current-thread by cc-by-sa and MIT license