Problemas com Merge em classes filhas!

2 respostas
nei.junior

Pessoa boa tarde !

Preciso de um help. Estou com problemas no momento de gravar um objeto com classes filhas. Vou exemplificar abaixo para que fique mais claro.

Tenho dois objetos, um chamado "CABECALHO" e outro "CORPO". Eu quero ter apenas um "Cabecalho", porém posso ter "Corpo 1", "Corpor 2", etc... . O relacionamento entre os dois é OneToOne e esta com o cascade PERSIST, MERGE e REFRESH; Portanto, quando vou criar um novo "Corpo", eu verifico se já existe um "Cabecalho" cadastrado. Caso sim eu resgato o "Cabecalho" e seto para o objeto que será inserido. Exemplo:
this.getCorpo().setCabecalho(cab);    

//Obs.:"cab" é o objeto "Cabecalho" que criei no método para resgatar o registro do banco.
Após setar, a minha tela já é populada com os dados o "Cabecalho" e fica faltando os atributos o objeto "Corpo" para popular. Com isso, eu altero alguns dados do "Cabecalho", preencho outros do objeto "Corpo" e mando salvar da seguinte forma:
entityManager.merge(this.getCorpo());

//Obs.: A forma de gravar acima é apenas exemplo para ficar mais claro.
Ao salvar esta gerando o seguinte erro (é apenas isso a mensagem, não tem mais nada detalhado):
HTTP Status 500 -

type Exception report

message

descriptionThe server encountered an internal error () that prevented it from fulfilling this request.
exception

javax.servlet.ServletException: #{mbCorpos.incluirEntidade}: javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.
root cause

javax.faces.FacesException: #{mbCorpos.incluirEntidade}: javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.
root cause

javax.faces.el.EvaluationException: javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.
root cause
javax.ejb.EJBException: Transaction aborted; nested exception is: javax.transaction.RollbackException: Transaction marked for rollback.

note The full stack traces of the exception and its root causes are available in the Sun Java System Application Server 9.1_02 logs.

Porém a mensagem de erro não ajudou muito. Sendo assim efetuei alguns testes e verifiquei o seguinte:
- O problema esta ocorrendo pois o objeto "Cabecalho" esta como "detach". Sendo assim, se antes de gravar eu faço um merge no objeto "Cabecalho" (para coloca-lo no contexto de persistência, pois alterei alguns atributos do mesmo) e em seguida eu faço o merge do objeto "Corpo", o mesmo salva o registro no banco.

Obs.: Quando incluo um cadastro do zero, o mesmo salva também sem problemas.

Minha pergunta é:
Ao fazer o merge na classe Pai, as classes filhas não serão adicionadas no contexto de persistência ? Tenho que inseri-las manualmente antes de tentar efetuar o merge na classe Pai ?

Aguardo e Obrigado !

2 Respostas

paulofafism

Eu customo fazer dessa forma quando preciso salvar.

Suponhamos que eu tenha a classe NotasFiscais e ItensNotasFiscais

//O método abaixo é apenas um exemplo de como vc poderia fazer
//Antes de chamar o método inicio uma transação depois de executar o método efetuo o commit

public void salvarNota(Nota nota, List<ItensNotasFiscais> itens)

    //Salvando o cabecalho
    NotasFiscais notasFiscais = (Cabecalho)entityManager.merge(nota);  
    entityManager.persist(cabecalho);


    //Salvando os itens da nota
    for (ItensNotasFiscais it : itens){


         itensNotasFiscais.setNotaFiscal(notasFiscais);       
        ItensNotasFiscais itensNota = (ItensNotasFiscais)entityManager.merge(itensNotasFiscais);  

         entityManager.persist(it);
     }

   
}
nei.junior

paulofafism:
Eu customo fazer dessa forma quando preciso salvar.

Suponhamos que eu tenha a classe NotasFiscais e ItensNotasFiscais…

Fala Paulo.

Então cara, vlw pela dica, mas no meu caso não poderia estar fazendo dessa forma !
Teria que ser como disse no exemplo acima mesmo.

Alguma outra ideia ?

Obrigado.

Criado 27 de agosto de 2009
Ultima resposta 4 de set. de 2009
Respostas 2
Participantes 2