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

Erro ao excluir um objeto

Método de remoção o objeto:

Já tentei descobrir e não consegui.

@Transactional public class BaseRepositorio {

@PersistenceContext private EntityManager entityManager;

public EntityManager getEntityManager() { return entityManager; }

public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; }

public void remover(T objeto) { getEntityManager().remove(objeto); } }

Mostra este erro no html

Exception

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalArgumentException: Removing a detached instance br.com.netsoft.desif.model.endereco.PaisEntity#85 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:635) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

7 respostas

Continuação

Root Cause

java.lang.IllegalArgumentException: Removing a detached instance br.com.netsoft.desif.model.endereco.PaisEntity#85 org.hibernate.jpa.event.internal.core.JpaDeleteEventListener.performDetachedEntityDeletionCheck(JpaDeleteEventListener.java:52) org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:89) org.hibernate.event.internal.DefaultDeleteEventListener.onDelete(DefaultDeleteEventListener.java:56) org.hibernate.internal.SessionImpl.fireDelete(SessionImpl.java:976) org.hibernate.internal.SessionImpl.delete(SessionImpl.java:912) org.hibernate.internal.SessionImpl.remove(SessionImpl.java:3330) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.orm.jpa.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler.invoke(SharedEntityManagerCreator.java:298) com.sun.proxy.$Proxy194.remove(Unknown Source) br.com.netsoft.desif.repositorio.BaseRepositorio.remover(BaseRepositorio.java:47) br.com.netsoft.desif.repositorio.BaseRepositorio$$FastClassBySpringCGLIB$$71b2a65a.invoke() org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:673) br.com.netsoft.desif.repositorio.endereco.PaisRepositorio$$EnhancerBySpringCGLIB$$caa19ce2.remover() br.com.netsoft.desif.servico.endereco.PaisServico.excluir(PaisServico.java:41) br.com.netsoft.desif.controller.endereco.PaisController.excluir(PaisController.java:75) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) java.lang.reflect.Method.invoke(Unknown Source) org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:635) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:742) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

Bom dia Guilherme, o erro Removing a detached instance significa que não está sendo passando um objeto managed para ser removido.

Não entendi. Em que parte ?

Guilherme ele quis dizer que você não está excluindo um objeto managed, por exemplo não está no estado managed, não está cadastrado no banco de dados, ou você tá passando um objeto que nem foi adicionado no banco, ou não tá usando o metodo find para buscar do banco um objeto

Bom dia Guilherme, para a JPA controlar sua entidade ela utiliza "estados", como transient, removed, managed e detached. Se você quiser alterar ou remover sua entidade, precisa deixa-la no estado managed, caso contrário a JPA não consegue gerencia-la e não faz a alteração correta. Se você tem esse registro no banco e quer remove-lo, utilize o método find que retorna um objeto managed e depois remove

Agora esta dando erro em

br.com.netsoft.desif.model.endereco.PaisEntity cannot be cast to java.lang.Class

Inclui o método find ao remover.

public void remover(T objeto, Long id) {
        getEntityManager().remove(find(objeto, id));
    }
public T find(T objeto, Long id) {
        return getEntityManager().find((Class<T>) objeto, id);
    }

Só que o erro fala que o objeto não pode ser um Class .

solução!

Resolvido assim

public T find(T objeto, Long id) {
    Class classe = objeto.getClass();
    return (T) getEntityManager().find(classe, id);
}