Problemas com Merge em classes filhas!

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:

[code]this.getCorpo().setCabecalho(cab);

//Obs.:“cab” é o objeto “Cabecalho” que criei no método para resgatar o registro do banco.[/code]
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:

[code]entityManager.merge(this.getCorpo());

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

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

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 !

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

[code]
public void salvarNota(Nota nota, List 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);
 }

}[/code]

[quote=paulofafism]Eu customo fazer dessa forma quando preciso salvar.

Suponhamos que eu tenha a classe NotasFiscais e ItensNotasFiscais…
[/quote]

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.