Problema com JPA

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

[code] public void cadastrar() {
TabAgendadosPeritosDAO tapDAO = new TabAgendadosPeritosDAO();
try {
List listaProcessos = new ArrayList();
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 ...

[/code]
Esse é o que dá errado [code]
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());

    }

}

[/code]
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 ?

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 ).

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.

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.

[quote=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.[/quote]
Já fiz o debug e ele lança a exception na segunda tentativa de cadastro …

Mas é quando voce vai atualizar ou salvar um novo registro ?

[quote=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.[/quote]

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 …

hummmm, ja verificou se quando voce salva ele ta armazenando o id do ultimo registro ?

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

Onde esta a instancia de tap ? onde esta declarada ?

tap.setTppericia(tipoPericia);  

[quote=rof20004]Onde esta a instancia de tap ? onde esta declarada ?

tap.setTppericia(tipoPericia); [/quote]
é feita antes com pelos metodos de get e set

[code]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;
}[/code]

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");  
.....................

[quote=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");  
.....................

[/quote]
Esse codigo que tu pegou é do que metodo que funciona beleza… o metodo que dá o erro é esse aqui

[code] 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());

    }

}[/code]

Bota o que te mostri nele ae entao =D

Pega nao … não salva …

é 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.

Valeu cara …já ajudou bastante …
Vou fazer em jdbc …
Tenho que resolver isso
kkkkkk