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 ?
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.
[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 …
[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 …
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
/**
* 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]
é 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.