Tenho uma aplicação que funciona normal com jpa até um certo ponto.
Minha aplicação é web e tenho duas telas assim consequentemente tenho dois mbs .
Em uma tela o JPA funciona tranquilo sem erros nem mais problemas.
Mas na segunda tela ele tenta alterar um campo(id) quando se é pedido para ele salvar normalmente .
O método que faz o salvar é o mesmo nas duas telas ....
Como resolver já fiz novamente o persistence e nada ...
Meus codigos de salvar são
publicvoidcadastrar(){TabAgendadosPeritosDAOtapDAO=newTabAgendadosPeritosDAO();try{List<PProcesso>listaProcessos=newArrayList<PProcesso>();listaProcessos=verificaProcesso();if(!listaProcessos.isEmpty()){if(tapDAO.listar(tap.getNuProcesso(),tap.getAreaPerito().getCodArea(),tap.getNome()).isEmpty()){TabUsuariousuario=(TabUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");Calendarc=Calendar.getInstance();tap.setVaraProcesso(String.valueOf(listaProcessos.get(0).getVara()));tap.setLog(usuario.getCodUsuario()+" em "+c.getTime().toString());tap.setStatus("siapJava");if(tipoPericia.equals("E")){tap.setExtJEF(tipoPericia);}else{tap.setExtJEF("J");}tapDAO.inserirEditar(tap);limpar();JSFUtil.setaMensagemInfo("Cadastro/Edição efetuado com sucesso!");}else{JSFUtil.setaMensagemError("Já existe Processo cadastrado para essa área/perito");}}else{JSFUtil.setaMensagemError("Processo inválido");}}catch(Exceptione){e.printStackTrace();JSFUtil.setaMensagemError("Erro no cadastro: "+e.getMessage());}}//esse é o que salva normal ...
Esse é o que dá errado
publicvoidcadastrar(){TabAgendaPeritoDAOtapDAO=newTabAgendaPeritoDAO();TabAreaPeritoDAOtap1DAO=newTabAreaPeritoDAO();try{TabUsuariousuario=(TabUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");Calendarc=Calendar.getInstance();tap.setTppericia(tipoPericia);tap.setAtualizacao(usuario.getCodUsuario()+" em "+c.getTime().toString());tapDAO.inserirEditar(tap);limpar();JSFUtil.setaMensagemInfo("Cadastro/Edição efetuado com sucesso!");}catch(Exceptione){e.printStackTrace();JSFUtil.setaMensagemError("Erro no cadastro: "+e.getMessage());}}
Os dois metodos passam pelo inserir e editar que é um metodo generico ...
Como posso resolver tal problema ?
Mas qual o problema ? ainda nao entendi. Voce nao ta conseguindo alterar ? e qual a mensagem de erro ?
Matheus_Paiva
Ele dá rollbackexception …
Ele era para salvar … e tenta mudar um o id …ou o nome (tenta sempre alterar os campos da pk que é composta por nome e id ).
MiguelCP
Isso pode acontecer quando na pagina web exista os campos setados, por exemplo, quando vai inserir um dado no banco, a pessoa não preenche o ID, pois é inserido de forma automática, mas se você coloca o ID e esse já exista ele vai alterar os dados alterados, então é bom vê se esses campos estão nesta pagina web que está dando este erro.
R
rof20004
Tem que ver direito Matheus Paiva, faz um debug no momento em que voce quer alterar um registro, e vai com calma analisando cada passo, ate ver onde gera a excessao.
Flw.
Matheus_Paiva
rof20004:
Tem que ver direito Matheus Paiva, faz um debug no momento em que voce quer alterar um registro, e vai com calma analisando cada passo, ate ver onde gera a excessao.
Flw.
Já fiz o debug e ele lança a exception na segunda tentativa de cadastro …
R
rof20004
Mas é quando voce vai atualizar ou salvar um novo registro ?
Matheus_Paiva
rof20004:
Tem que ver direito Matheus Paiva, faz um debug no momento em que voce quer alterar um registro, e vai com calma analisando cada passo, ate ver onde gera a excessao.
Flw.
Eu vou salvando salvando … ai chega um ponto que ele nao permite salvar alegando que eu to tentando alterar ou o nome ou o id de x para y …
R
rof20004
hummmm, ja verificou se quando voce salva ele ta armazenando o id do ultimo registro ?
Matheus_Paiva
De acordo com a demanda ele vai salvando até que chega um momento que ele nao salva mais e alega que está alterando um campo trocando o id …trocando o nome …Sempre trocando um campo da chave composta …
Stacktrace:
APACHE TOMCAT
15/01/2013 14:23:51 org.apache.catalina.util.LifecycleBase start
INFO: The start() method was called on component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[/siapJava]] after start() had already been called. The second call will be ignored.
15/01/2013 14:23:53 org.apache.jasper.compiler.TldLocationsCache tldScanJar
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
WARNING *********** NetBeans HTTP Monitor ************
The request cannot be recorded most likely because the NetBeans HTTP Monitor module is disabled.
javax.persistence.RollbackException: Error while commiting the transaction
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:71)
at br.jus.jfba.utils.jpa.dao.GenericDAO.inserirEditar(GenericDAO.java:44)
at br.jus.jfba.siap.apresentacao.jsf.mb.TabAgendaPeritoMB.cadastrar(TabAgendaPeritoMB.java:154)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.el.parser.AstValue.invoke(AstValue.java:264)
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:278)
at org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:70)
at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
at javax.faces.component.UICommand.broadcast(UICommand.java:383)
at org.ajax4jsf.component.AjaxViewRoot.processEvents(AjaxViewRoot.java:321)
at org.ajax4jsf.component.AjaxViewRoot.broadcastEvents(AjaxViewRoot.java:296)
at org.ajax4jsf.component.AjaxViewRoot.processPhase(AjaxViewRoot.java:253)
at org.ajax4jsf.component.AjaxViewRoot.processApplication(AjaxViewRoot.java:466)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
at com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.ajax4jsf.webapp.BaseXMLFilter.doXmlFilter(BaseXMLFilter.java:178)
at org.ajax4jsf.webapp.BaseFilter.handleRequest(BaseFilter.java:290)
at org.ajax4jsf.webapp.BaseFilter.processUploadsAndHandleRequest(BaseFilter.java:390)
at org.ajax4jsf.webapp.BaseFilter.doFilter(BaseFilter.java:517)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:225)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:169)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:927)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:999)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:565)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:309)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.HibernateException: identifier of an instance of br.jus.jfba.siap.vo.TabAreaPerito was altered from 6 to 2
at org.hibernate.event.def.DefaultFlushEntityEventListener.checkId(DefaultFlushEntityEventListener.java:58)
at org.hibernate.event.def.DefaultFlushEntityEventListener.getValues(DefaultFlushEntityEventListener.java:164)
at org.hibernate.event.def.DefaultFlushEntityEventListener.onFlushEntity(DefaultFlushEntityEventListener.java:120)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEntities(AbstractFlushingEventListener.java:196)
at org.hibernate.event.def.AbstractFlushingEventListener.flushEverythingToExecutions(AbstractFlushingEventListener.java:76)
at org.hibernate.event.def.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:26)
at org.hibernate.impl.SessionImpl.flush(SessionImpl.java:1000)
at org.hibernate.impl.SessionImpl.managedFlush(SessionImpl.java:338)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:106)
at org.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:54)
... 45 more
R
rof20004
Onde esta a instancia de tap ? onde esta declarada ?
tap.setTppericia(tipoPericia);
Matheus_Paiva
rof20004:
Onde esta a instancia de tap ? onde esta declarada ?
tap.setTppericia(tipoPericia);
é feita antes com pelos metodos de get e set
publicclassTabAgendaPeritoMB{privateTabAgendaPeritotap;privateList<SelectItem>areasPeritos;privateList<SelectItem>nomesPeritos;privateStringtipoPericia;privateStringhora;privateDatedata;/** * Creates a new instance of TabAgendadosPeritosMB */publicTabAgendaPeritoMB(){tap=newTabAgendaPerito();tap.setAreaPerito(newTabAreaPerito());nomesPeritos=newArrayList<SelectItem>();carregaAreas();}publicTabAgendaPeritogetTap(){returntap;}publicvoidsetTap(TabAgendaPeritotap){this.tap=tap;}publicList<SelectItem>getAreasPeritos(){returnareasPeritos;}publicvoidsetAreasPeritos(List<SelectItem>areasPeritos){this.areasPeritos=areasPeritos;}publicList<SelectItem>getNomesPeritos(){returnnomesPeritos;}publicvoidsetNomesPeritos(List<SelectItem>nomesPeritos){this.nomesPeritos=nomesPeritos;}publicStringgetHora(){returnhora;}publicvoidsetHora(Stringhora){this.hora=hora;}publicvoidsetData(Datedata){this.data=data;}publicDategetData(){returndata;}publicStringgetTipoPericia(){returntipoPericia;}publicvoidsetTipoPericia(StringtipoPericia){this.tipoPericia=tipoPericia;}
Nao conheco nenhum padrao de projeto que estimule instanciacao de classes no construtor de uma outra classe. Mas vamos meter a cara na budega, hehehehe
Faz um teste. Neste codigo:
publicvoidcadastrar(){TabAgendadosPeritosDAOtapDAO=newTabAgendadosPeritosDAO();try{List<PProcesso>listaProcessos=newArrayList<PProcesso>();listaProcessos=verificaProcesso();if(!listaProcessos.isEmpty()){if(tapDAO.listar(tap.getNuProcesso(),tap.getAreaPerito().getCodArea(),tap.getNome()).isEmpty()){TabUsuariousuario=(TabUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");Calendarc=Calendar.getInstance();// DA UM NEW AQUI MANOTabAgendaPeritoMBtap=newTabAgendaPeritoMB();// AQUI NO MEIO, ENTRES ESSES 2 COMENTARIOStap.setVaraProcesso(String.valueOf(listaProcessos.get(0).getVara()));tap.setLog(usuario.getCodUsuario()+" em "+c.getTime().toString());tap.setStatus("siapJava");.....................
Nao conheco nenhum padrao de projeto que estimule instanciacao de classes no construtor de uma outra classe. Mas vamos meter a cara na budega, hehehehe
Faz um teste. Neste codigo:
publicvoidcadastrar(){TabAgendadosPeritosDAOtapDAO=newTabAgendadosPeritosDAO();try{List<PProcesso>listaProcessos=newArrayList<PProcesso>();listaProcessos=verificaProcesso();if(!listaProcessos.isEmpty()){if(tapDAO.listar(tap.getNuProcesso(),tap.getAreaPerito().getCodArea(),tap.getNome()).isEmpty()){TabUsuariousuario=(TabUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");Calendarc=Calendar.getInstance();// DA UM NEW AQUI MANOTabAgendaPeritoMBtap=newTabAgendaPeritoMB();// AQUI NO MEIO, ENTRES ESSES 2 COMENTARIOStap.setVaraProcesso(String.valueOf(listaProcessos.get(0).getVara()));tap.setLog(usuario.getCodUsuario()+" em "+c.getTime().toString());tap.setStatus("siapJava");.....................
Esse codigo que tu pegou é do que metodo que funciona beleza... o metodo que dá o erro é esse aqui
publicvoidcadastrar(){TabAgendaPeritoDAOtapDAO=newTabAgendaPeritoDAO();TabAreaPeritoDAOtap1DAO=newTabAreaPeritoDAO();try{TabUsuariousuario=(TabUsuario)FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");Calendarc=Calendar.getInstance();tap.setTppericia(tipoPericia);tap.setAtualizacao(usuario.getCodUsuario()+" em "+c.getTime().toString());tapDAO.inserirEditar(tap);JSFUtil.setaMensagemInfo("Cadastro/Edição efetuado com sucesso!");}catch(Exceptione){e.printStackTrace();JSFUtil.setaMensagemError("Erro no cadastro: "+e.getMessage());}}
R
rof20004
Bota o que te mostri nele ae entao =D
Matheus_Paiva
Pega nao … não salva …
R
rof20004
é mano, sinceridade, eu to ate com preguiça de ler teu codigo hehehehe, assim que eu chegar em casa, se EU tiver um tempinho e leio com mais calma, agora alem de ta no trampo, to com ter-sol (sei la como se escreve isso). Vamos ver se alguem pode te ajudar ae, boa sorte, nao desista , continue tentando.
Matheus_Paiva
Valeu cara …já ajudou bastante …
Vou fazer em jdbc …
Tenho que resolver isso
kkkkkk