Solucionado (ver solução)
Solucionado
(ver solução)
6
respostas

exception ao trocar método do JPA para hibernate

ao trocar o metodo getProdutos do JPA pelo do hibernate tenho a seguinte exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No transactional EntityManager available
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause

java.lang.IllegalStateException: No transactional EntityManager available
    org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:267)
    com.sun.proxy.$Proxy38.unwrap(Unknown Source)
    br.com.caelum.dao.ProdutoDao.getProdutos(ProdutoDao.java:65)
    br.com.caelum.controller.ProdutoController.buscarPor(ProdutoController.java:69)
    br.com.caelum.controller.ProdutoController$$FastClassBySpringCGLIB$$888d3969.invoke(<generated>)
    org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)
    org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:649)
    br.com.caelum.controller.ProdutoController$$EnhancerBySpringCGLIB$$77823fd.buscarPor(<generated>)
    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.doInvoke(InvocableHandlerMethod.java:221)
    org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
    org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
    org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
    org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
    org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
note The full stack trace of the root cause is available in the Apache Tomcat/7.0.62 logs.
6 respostas

Oi Kim, tudo bem?

Pode mostrar o código do seu getProdutos?

Abraços!

public List<Produto> getProdutos(String nome, Integer categoriaId, Integer lojaId) {
        Session session = em.unwrap(Session.class);
        Criteria criteria = session.createCriteria(Produto.class);

        if (!nome.isEmpty()) {
            criteria.add(Restrictions.like("nome", "%" + nome + "%"));
        }

        if (lojaId != null) {
            criteria.add(Restrictions.like("loja.id", lojaId));
        }

        if (categoriaId != null) {
            criteria.setFetchMode("categorias", FetchMode.JOIN)
                .createAlias("categorias", "c")
                .add(Restrictions.like("c.id", categoriaId));
        }

        return (List<Produto>) criteria.list();

    }

Oi Kim,

Como o Spring gerencia nosso EntityManager, ele pede pra que já exista um EntityManager aberto quando você chamar o em.unwrap.

Você pode anotar o método com @Transactional (forçando o EntityManager a viver do inicio ao fim dessa transação) ou avançar para o capítulo seguinte onde registramos o OpenEntityManagerInViewInterceptor que abrirá o EntityManager a cada request.

OBS: Essa observação não estava no exercício, já corrigi! Obrigado pelo feedback :)

Abraços!

Oi Kim, tudo bem?

Conseguiu resolver?

Abraços!

solução!

Oi Kim,

Estou fechando este tópico, pode ficar a vontade para abrir outro caso ainda haja dúvidas!

Abraços!