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

Erro ao alterar um objeto

Método de remoção o objeto:

Já tentei descobrir e não consegui.

    @Transactional
    public class BaseRepositorio<T> {

        @PersistenceContext
        private EntityManager entityManager;

        public EntityManager getEntityManager() {
            return entityManager;
        }

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

        public T alterar(T objeto) {
            return this.entityManager.merge(objeto);
        }
    }


**Exception**

    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [br.com.netsoft.desif.model.endereco.PaisEntity#72]
        org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:982)
        org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:872)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        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)
15 respostas

Continuando

Root Cause

    javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [br.com.netsoft.desif.model.endereco.PaisEntity#72]
        org.hibernate.internal.ExceptionConverterImpl.wrapStaleStateException(ExceptionConverterImpl.java:197)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:86)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
        org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:878)
        org.hibernate.internal.SessionImpl.merge(SessionImpl.java:852)
        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.$Proxy244.merge(Unknown Source)
        br.com.netsoft.desif.repositorio.BaseRepositorio.alterar(BaseRepositorio.java:43)
        br.com.netsoft.desif.repositorio.BaseRepositorio$$FastClassBySpringCGLIB$$71b2a65a.invoke(<generated>)
        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$$d5ac8b59.alterar(<generated>)
        br.com.netsoft.desif.servico.endereco.PaisServico.salvar(PaisServico.java:30)
        br.com.netsoft.desif.controller.endereco.PaisController.salvar(PaisController.java:51)
        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.doPost(FrameworkServlet.java:872)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        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)

Continuando

javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [br.com.netsoft.desif.model.endereco.PaisEntity#72]
        org.hibernate.internal.ExceptionConverterImpl.wrapStaleStateException(ExceptionConverterImpl.java:197)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:86)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:155)
        org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
        org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:878)
        org.hibernate.internal.SessionImpl.merge(SessionImpl.java:852)
        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.$Proxy244.merge(Unknown Source)
        br.com.netsoft.desif.repositorio.BaseRepositorio.alterar(BaseRepositorio.java:43)
        br.com.netsoft.desif.repositorio.BaseRepositorio$$FastClassBySpringCGLIB$$71b2a65a.invoke(<generated>)
        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$$d5ac8b59.alterar(<generated>)
        br.com.netsoft.desif.servico.endereco.PaisServico.salvar(PaisServico.java:30)
        br.com.netsoft.desif.controller.endereco.PaisController.salvar(PaisController.java:51)
        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.doPost(FrameworkServlet.java:872)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        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)

Continuando

Root Cause

    org.hibernate.StaleObjectStateException: Row was updated or deleted by another transaction (or unsaved-value mapping was incorrect) : [br.com.netsoft.desif.model.endereco.PaisEntity#72]
        org.hibernate.event.internal.DefaultMergeEventListener.entityIsDetached(DefaultMergeEventListener.java:322)
        org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:170)
        org.hibernate.event.internal.DefaultMergeEventListener.onMerge(DefaultMergeEventListener.java:69)
        org.hibernate.internal.SessionImpl.fireMerge(SessionImpl.java:866)
        org.hibernate.internal.SessionImpl.merge(SessionImpl.java:852)
        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.$Proxy244.merge(Unknown Source)
        br.com.netsoft.desif.repositorio.BaseRepositorio.alterar(BaseRepositorio.java:43)
        br.com.netsoft.desif.repositorio.BaseRepositorio$$FastClassBySpringCGLIB$$71b2a65a.invoke(<generated>)
        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$$d5ac8b59.alterar(<generated>)
        br.com.netsoft.desif.servico.endereco.PaisServico.salvar(PaisServico.java:30)
        br.com.netsoft.desif.controller.endereco.PaisController.salvar(PaisController.java:51)
        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.doPost(FrameworkServlet.java:872)
        javax.servlet.http.HttpServlet.service(HttpServlet.java:661)
        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)

Oi Guilherme, tudo bem?

Essa exception, na teoria, indica que sua classe tem um @Version e alguém está trabalhando com uma versão antiga do objeto. Tem como verificar? Também seria importante você passar um pouco do cenário que o erro acontece.

Este projeto, somente eu que estou trabalhando.

Primeiro passo:

1) Carrega a lista de países 2) Em cada registro existe o botão alterar e excluir 3) Ao clicar em Editar ele carrega o objeto pelo ID pelo metodo Find. 4) Se clico em salvar ele mostra este erro.

Metodo find.

public T buscarPorId(T objeto, Long id) {
    return (T) this.entityManager.find(objeto.getClass(), id);
}

Método de atualizar o objeto, aonde ocorre o erro.

public T alterar(T objeto) {
    return this.entityManager.merge(objeto);
}

Alguma ajuda ?

Na tela de alterar voce precisa a versão do objeto. Ou carregar a versao anterior do objeto antes de salvar.

Tenho que ter dois objetos. Não entendi.

Pode me dar um exemplo.

Oi Guilherme, vou tentar bolar um exemplo aqui. Na sua classe você de ter um atributo anotado com version. Você pode criar um getter um setter para ele, colocar isso em um campo hidden no seu formulário e quando o objeto for ser editado, ele é populado com esse version de novo.

Existe sim.

@Version
@Column(name = "NR_VERSAO")
public int getNrVersao() {
    return nrVersao;
}

Então ??

Oi Guilherme, acho que me passei aqui. Você agora precisa colocar esse valor no formulário é receber isso no Controller.

Toda vez que alterar tenho que incrementar este valor, correto ?

solução!

Opa, na verdade não. Sempre que você for alterar, você vai montar o objeto setando a versão que estava no formulário. Quando você for salvar, o hibernate vai soltar exception caso já tenha uma versão mais nova do objeto no banco de dados.

Ok. Obrigado