Problema com JPA

17 respostas
Matheus_Paiva
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
public void cadastrar() {
        TabAgendadosPeritosDAO tapDAO = new TabAgendadosPeritosDAO();
        try {
            List<PProcesso> listaProcessos = new ArrayList<PProcesso>();
            listaProcessos=verificaProcesso();
            if (!listaProcessos.isEmpty()) {
                if (tapDAO.listar(tap.getNuProcesso(), tap.getAreaPerito().getCodArea(), tap.getNome()).isEmpty()){
                
                TabUsuario usuario = (TabUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
                Calendar c = 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 (Exception e) {
            e.printStackTrace();

            JSFUtil.setaMensagemError("Erro no cadastro: " + e.getMessage());

        }

    }//esse  é  o que salva normal ...
Esse é o que dá errado
public void cadastrar() {
       TabAgendaPeritoDAO tapDAO = new TabAgendaPeritoDAO();
       TabAreaPeritoDAO tap1DAO=new TabAreaPeritoDAO();
        try {
            
            
            
                
                
                TabUsuario usuario = (TabUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
                Calendar c = 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 (Exception e) {
            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 ?

17 Respostas

R

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

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

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

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

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
public class TabAgendaPeritoMB {

    private TabAgendaPerito tap;
    private List<SelectItem> areasPeritos;
    private List<SelectItem> nomesPeritos;
    private String tipoPericia;
    private String hora;
    private Date data;

    /**
     * Creates a new instance of TabAgendadosPeritosMB
     */
    public TabAgendaPeritoMB() {
        tap = new TabAgendaPerito();
        tap.setAreaPerito(new TabAreaPerito());
        nomesPeritos = new ArrayList<SelectItem>();
        carregaAreas();

    }

    public TabAgendaPerito getTap() {
        return tap;
    }

    public void setTap(TabAgendaPerito tap) {
        this.tap = tap;
    }

    public List<SelectItem> getAreasPeritos() {
        return areasPeritos;
    }

    public void setAreasPeritos(List<SelectItem> areasPeritos) {
        this.areasPeritos = areasPeritos;
    }

    public List<SelectItem> getNomesPeritos() {
        return nomesPeritos;
    }

    public void setNomesPeritos(List<SelectItem> nomesPeritos) {
        this.nomesPeritos = nomesPeritos;
    }

    public String getHora() {
        return hora;
    }

    public void setHora(String hora) {
        this.hora = hora;
    }

    public void setData(Date data) {
        this.data = data;
    }

    public Date getData() {
        return data;
    }

    public String getTipoPericia() {
        return tipoPericia;
    }

    public void setTipoPericia(String tipoPericia) {
        this.tipoPericia = tipoPericia;
    }
R

Entao, acho que nao ta legal isso aqui:

/** 
     * Creates a new instance of TabAgendadosPeritosMB 
     */  
    public TabAgendaPeritoMB() {  
        tap = new TabAgendaPerito();  
        tap.setAreaPerito(new TabAreaPerito());  
        nomesPeritos = new ArrayList<SelectItem>();  
        carregaAreas();  
  
    }

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:

public void cadastrar() {  
       TabAgendadosPeritosDAO tapDAO = new TabAgendadosPeritosDAO();  
       try {  
           List<PProcesso> listaProcessos = new ArrayList<PProcesso>();  
           listaProcessos=verificaProcesso();  
           if (!listaProcessos.isEmpty()) {  
               if (tapDAO.listar(tap.getNuProcesso(), tap.getAreaPerito().getCodArea(), tap.getNome()).isEmpty()){  
                 
               TabUsuario usuario = (TabUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");  
               Calendar c = Calendar.getInstance();  

              // DA UM NEW AQUI MANO
               TabAgendaPeritoMB tap = new TabAgendaPeritoMB();              
    
             // AQUI NO MEIO, ENTRES ESSES 2 COMENTARIOS

               tap.setVaraProcesso(String.valueOf(listaProcessos.get(0).getVara()));  
               tap.setLog(usuario.getCodUsuario() + " em " + c.getTime().toString());  
               tap.setStatus("siapJava");  
.....................
Matheus_Paiva
rof20004:
Entao, acho que nao ta legal isso aqui:
/** 
     * Creates a new instance of TabAgendadosPeritosMB 
     */  
    public TabAgendaPeritoMB() {  
        tap = new TabAgendaPerito();  
        tap.setAreaPerito(new TabAreaPerito());  
        nomesPeritos = new ArrayList<SelectItem>();  
        carregaAreas();  
  
    }

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:
public void cadastrar() {  
       TabAgendadosPeritosDAO tapDAO = new TabAgendadosPeritosDAO();  
       try {  
           List<PProcesso> listaProcessos = new ArrayList<PProcesso>();  
           listaProcessos=verificaProcesso();  
           if (!listaProcessos.isEmpty()) {  
               if (tapDAO.listar(tap.getNuProcesso(), tap.getAreaPerito().getCodArea(), tap.getNome()).isEmpty()){  
                 
               TabUsuario usuario = (TabUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");  
               Calendar c = Calendar.getInstance();  

              // DA UM NEW AQUI MANO
               TabAgendaPeritoMB tap = new TabAgendaPeritoMB();              
    
             // AQUI NO MEIO, ENTRES ESSES 2 COMENTARIOS

               tap.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
public void cadastrar() {
        TabAgendaPeritoDAO tapDAO = new TabAgendaPeritoDAO();
        TabAreaPeritoDAO tap1DAO = new TabAreaPeritoDAO();
        try {





            TabUsuario usuario = (TabUsuario) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("usuario");
            Calendar c = 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 (Exception e) {
            e.printStackTrace();

            JSFUtil.setaMensagemError("Erro no cadastro: " + e.getMessage());

        }

    }
R

Bota o que te mostri nele ae entao =D

Matheus_Paiva

Pega nao … não salva …

R

é 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

Criado 14 de janeiro de 2013
Ultima resposta 15 de jan. de 2013
Respostas 17
Participantes 3