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 !