(JPA + EclipseLink) - Problema para Salvar (java.lang.IllegalStateException)

4 respostas
I

Olá galera do GUJ!

Estou com um problema que já está pra me deixar doido de vez. Utilizo o NetBeans 7.1.1 e o EclipseLink em meu projeto.
O erro se dá na hora em que vou salvar um orçamento, segue o erro:

pojos.Orcamento[ idorcamento=null ] 03/01/2013 13:36:00 controller.OrcamentoController salvarOrcamento GRAVE: null java.lang.IllegalStateException: During synchronization a new object was found through a relationship that was not marked cascade PERSIST: pojos.SalasOrcamento[ idsalasOrcamento=null ]. at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.discoverUnregisteredNewObjects(RepeatableWriteUnitOfWork.java:302) at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.calculateChanges(UnitOfWorkImpl.java:695) at org.eclipse.persistence.internal.sessions.RepeatableWriteUnitOfWork.writeChanges(RepeatableWriteUnitOfWork.java:431) at org.eclipse.persistence.internal.jpa.EntityManagerImpl.flush(EntityManagerImpl.java:780) at daos.OrcamentoDAO.salvar(OrcamentoDAO.java:103) at controller.OrcamentoController.salvarOrcamento(OrcamentoController.java:397) at view.OrcamentoJIForm.buttonSalvarActionPerformed(OrcamentoJIForm.java:948) at view.OrcamentoJIForm.access$1300(OrcamentoJIForm.java:27) at view.OrcamentoJIForm$14.actionPerformed(OrcamentoJIForm.java:869) at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995) at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318) at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387) at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242) at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236) at java.awt.AWTEventMulticaster.mouseReleased(AWTEventMulticaster.java:272) at java.awt.Component.processMouseEvent(Component.java:6267) at javax.swing.JComponent.processMouseEvent(JComponent.java:3267) at java.awt.Component.processEvent(Component.java:6032) at java.awt.Container.processEvent(Container.java:2041) at java.awt.Component.dispatchEventImpl(Component.java:4630) at java.awt.Container.dispatchEventImpl(Container.java:2099) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4577) at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4238) at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4168) at java.awt.Container.dispatchEventImpl(Container.java:2085) at java.awt.Window.dispatchEventImpl(Window.java:2478) at java.awt.Component.dispatchEvent(Component.java:4460) at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269) at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161) at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)

Agora, o porquê desse erro me enlouquecer. Se eu abrir a Janela de Orçamento e salvar, dá certo. Salva tudo corretamente, até os relacionamentos do mesmo. Porém, se eu abrir a Janela de Contratos e através dela eu abrir a Janela de Orçamento e tentar salvar, ocorre esse erro.

A diferença do processo é que, ao abrir a Janela de Orçamento pela de Contratos, a janela irá abrir já preenchida com os todos os dados e com um dos relacionamentos já salvo.

A linha do erro na minha DAO é onde eu chamo o método:em.flush();

Alguém saberia me dá um norte do que fazer? Já tentei n-coisas e não vejo sentido em ele dá um erro de Cascade, já que as anotações estão em seus lugares e se eu tentar abrindo a janela diretamente, dá tudo certo.

Desde já, muito obrigado!

4 Respostas

H

Leia aqui onde fala sobre o erro de Transient: JPA: Mini Livro - Primeiros passos e conceitos detalhados.

I

Olá Hebert!
Muito obrigado por novamente me ajudar com JPA! :smiley:

Li o seu artigo e tentei aplicar a idéia do attached/detached. Coloquei o CascadeType.[color=#00CC00]ALL[/color] na POJO de Orcamento na relação em que ele já recebe um objeto salvo no banco (classe Proposta). Tentei utilizar os métodos: em.detach(); em.find(); mas continua com o mesmo erro.

Na exceção, a pojo SalasOrcamento é acusada, mas em Orcamento, ela possui o CascadeType.[color=#00CC00]ALL[/color].
Na Janela de Orcamento existe um método em que adiciono todos os valores de um Orcamento que recebo e que utilizo tanto para alterar algum Orcamento já salvo que busco, como para setar os valores que tenho na Janela de Contratos.

Para ficar mais claro o que está sendo feito na Janela de Contratos:

  • Um orçamento é buscado
  • O ID desse orçamento é setado com [color=blue]null[/color].
  • Os IDs de SalasOrcamento são setados com [color=blue]null[/color].
  • Os IDs de Endereço e Contato tbm são setados com [color=blue]null[/color].
  • O único relacionamento em que não mexo é com o de Proposta.
    Tudo isso para que ele mantenha os mesmos valores, mas salve como outro Orcamento para uma mesma Proposta, pois na DAO é feita uma verificação se o ID é nulo. Sendo verdadeiro utilizo o persist(), se não, utilizo o merge().

Ainda estou tentando resolver esse problema, mas quando me animo por achar que encontrei uma solução, me desanimo logo em seguida ao ver que o erro persiste. :frowning:
Se alguém puder me dar uma luz, fico muito agradecido.
Obrigado.

I

Bem, galera…
Tenho procurado e tentado algumas coisas, mas nada tem funcionado.
O código dessa parte do sistema foi feito por outro programador da empresa que saiu recentemente e fiquei encarregado de terminar, porém esse erro é o que tem me dado dor de cabeça. Esse é o primeiro projeto que participo com JPA, então a conheço pouco.

Sobre o conceito de Contexto do JPA, não vejo onde algum objeto relacionado estaria detached. Já fiz por onde todos os objetos que seriam salvos fossem “attached”. Mas mesmo assim o erro continua aparecendo, igualzinho.

Se alguém puder me auxiliar ou me indicar algum artigo ou algo assim pra que eu possa entender e achar a solução,
Agradeço muito.
Valeu, galera.

F

Bem. Pelo erro algum objeto relacionado ao Orcamento ou SalasOrcamento está em um estado inválido. Têm algum relacionamento obrigatório não preenchido ou mesmo uma simples propriedade dentro de algum dos relacionamentos pode não estar preenchida.

Não conheço o domínio, mas por exemplo ao salvar SalasOrcamento que tem um Orcamento que tem um Cliente o CPF do cliente está com um valor inválido.

Precisa checar toda a hierarquia, já tive problemas assim e que eu me lembre o cenário era esse que tentei explicar.

Criado 3 de janeiro de 2013
Ultima resposta 11 de jan. de 2013
Respostas 4
Participantes 3