2017-02-17 3 views
0

Ich habe über 20 Fragen zu Stackoverflow im Zusammenhang damit gelesen, aber keiner von ihnen hat funktioniert.Spring @Transactional aufrufen abstrakten Oberklasse-Methode wirft org.hibernate.HibernateException

Grundsätzlich habe ich eine Service-abstrakte Oberklasse mit 3 Methoden. Persist ist wie eine Schablonenmethode, während Speichern und Aktualisieren nur bei Bedarf überschrieben werden.

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); 
     } 
    } 
} 

Dann habe ich diese Unterklasse

@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; 
    } 
} 

und dies ist mein Einstiegspunkt

@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); 
    } 
} 

Nun ist die Sache, wenn ich für die testSaving Methode aufrufen, alles richtig geht. ABER, wenn ich die persist Methode rufe, gibt es immer den erwähnten Fehler. Ich habe viele Dinge ausprobiert, wie @Transactional in die BaseService Superklasse hinzufügen und sogar das Hinzufügen zu meinem Repository funktioniert nicht. Bitte, ich muss das reparieren, es macht mich verrückt. Irgendein Rat?

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

hinzuzufügen ist, wenn Sie eine Ausnahme bitten, ** immer * * Veröffentlichen Sie den kompletten Stack-Trace der Ausnahme. –

+0

@JBNizet Frage aktualisiert –

Antwort

1

Dies ist beabsichtigt, siehe SPR-7824.

Sie müssen die Annotation @Transactional grundsätzlich in die Superklasse und nicht in die Unterklasse einfügen. Dies führt dazu, dass alle Methoden der Unterklasse sowohl transaktional als auch auf der Oberklasse basieren.

Wenn dies nicht möglich ist, überschreiben Sie die Methoden in der Unterklasse und delegieren Sie an die Oberklasse.

+0

Ich habe @Transactional zur Superklasse hinzugefügt, aber selbst dann funktioniert es nicht. Ich habe über Methoden nachgedacht, aber ich denke nicht, dass es gut aussieht. Gibt es keinen anderen Weg? –

+0

Hey Mann, aus irgendeinem unbekannten Grund, überschreibt alle Methoden, die an der Transaktion beteiligt sind, und ruft nach der Superklasse, macht es funktioniert, aber das schafft viele Probleme. Zum Beispiel kann jetzt jeder die Standardimplementierung meiner Vorlagenmethode überschreiben. Hast du irgendwelche Gedanken darüber, wie es funktioniert, ohne es außer Kraft zu setzen? –

0

fand ich endlich einen Weg, um dies möglich zu machen, so, für alle, die noch zu lösen dieses kämpft, der Trick @Transactional(propagation = Propagation.REQUIRES_NEW) auf Ihre Super xD

Verwandte Themen