2017-02-17 7 views
0

나는이에 관한 유래에 20 개 이상의 질문을 읽고,하지만 그들 중 아무도 일하지 발생합니다. 봄 @Transactional 전화 추상 슈퍼 방법은 org.hibernate.HibernateException

는 기본적으로 나는 3 가지 방법으로 서비스 추상 슈퍼 클래스가 있습니다. 지속성은 템플릿 메소드와 같지만 저장 및 업데이트는 필요할 때만 재정의됩니다.
public abstract class BaseService<E> implements ServiceImpl{ 
    protected E save(E object, Class<E> returnedClass){//save object} 
    protected E update(E object){//update object} 

    public boolean persist(E object) { 
     //validation rules 

     if(shouldSave) { 
      save(object); 
     }else { 
      update(object); 
     } 
    } 
} 

그때 나는이 서브 클래스를

@Service 
@Transactional 
public CompanyService extends BaseService<Company> { 
    @Autowired 
    private CompanyRepository repository; 

    public void testSaving(Company company) { 
     repository.save(company); 
    } 

    @Override //from service impl 
    public CommpanyRepositoy getRepository() { 
     return repository; 
    } 
} 

이 있고이 것은 내가 testSaving 방법을 요구하는 경우, 모든 것이 잘 진행입니다 지금 내 진입 점

@RestController 
@RequestMapping("/company") 
public CompanyRestController { 
    @Autowired 
    private CompanyService service; 

    @RequestMapping(value = "/save", method = RequestMethod.POST) 
    public boolean save(@RequestBody Company company) { 
     return service.persist(company); 
    } 
} 

입니다. 나는 persist 메서드를 호출 할 때, 항상 나와있는 오류를 제공합니다. 나는이 작동하지 않습니다 내 저장소에 추가 심지어 BaseService 슈퍼 클래스에 @Transactional을 추가하고 같은 많은의 일들을 시도했습니다. 제발,이 문제를 해결해야합니다. 어떤 충고?

org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 
    at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) 
    at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) 
    at br.com.jeffersontpadua.spring.generic.BaseRepository.getSession(BaseRepository.java:56) 
    at br.com.jeffersontpadua.spring.generic.BaseRepository.save(BaseRepository.java:27) 
    at br.com.jeffersontpadua.spring.service.BaseService.save(BaseService.java:45) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) 
    at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:723) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
    at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:655) 
    at br.com.jeffersontpadua.spring.service.CompanyService$$EnhancerBySpringCGLIB$$a3329725.save(<generated>) 
    at br.com.jeffersontpadua.spring.service.BaseService.persist(BaseService.java:34) 
    at br.com.jeffersontpadua.spring.rest.CompanyRestController.save(CompanyRestController.java:41) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136) 
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:114) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
    at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:650) 
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:731) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at br.com.jeffersontpadua.spring.filter.RequestFilter.doFilter(RequestFilter.java:34) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:505) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:169) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:956) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:436) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1078) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:625) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:316) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
    at java.lang.Thread.run(Thread.java:745) 
+1

@Transactional(propagation = Propagation.REQUIRES_NEW)을 추가하는 것입니다,이 일어날 수 있도록하는 방법을 발견, 그래서 ** 항상 * * 예외의 전체 스택 추적을 게시합니다. –

+0

@JBNizet 문제는 ​​내가 슈퍼 클래스에 @Transactional을 추가했지만 그렇다하더라도 그것이 작동하지 않는 –

답변

1

이것은 의도적으로, SPR-7824을 참조하십시오.

기본적으로 서브 클래스가 아닌 수퍼 클래스에 @Transactional 주석을 추가해야하므로 모든 서브 클래스 메소드가 트랜잭션뿐만 아니라 수퍼 클래스의 메소드가됩니다. 당신이 할 수없는 경우

, 서브 클래스의 메소드를 오버라이드 (override) 슈퍼 클래스에 위임합니다.

+0

업데이트. 나는 메소드를 오버라이드 (override)하는 것에 대해 생각했다. 그러나 나는 그것이 멋지다고 생각하지 않는다. 다른 방법이 없습니까? –

+0

안녕하세요, 몇 가지 알려지지 않은 이유로 거래에 관련된 모든 메소드를 재정의하고 수퍼 클래스를 호출하면 작동하지만 많은 문제가 발생합니다. 예를 들어, 이제 누구나 내 템플릿 메소드의 기본 구현을 재정의 할 수 있습니다. 무시하지 않고 작동시키는 방법에 대한 생각이 있습니까? –

0

나는 마침내 아직이 문제를 해결하기 위해 고민하는 사람을 위해, 트릭 당신이 예외에 대해 물어 보면 당신의 슈퍼 클래스의 xD