5
respostas

Begin e commit

em um trecho de codigo tenho o seguinte cenario:

adicionaAlguns dados na tabelaA com Hibernate persistindo

e adiciona filho na tabela B via instrucao sql.

porem ao adicionar na tabela B retorna registro pai não encontrado.

Acredito que seja um problema de commit.

porem eu gostaria de rodar todo o trecho dentro de uma transacao, caso ao inserir o registro na tabelaB de algum problema... por qualque outro motivo role o rollback.

alguem poderia me ajudar ?

5 respostas

Oi Bruna, depois de inserir via hibernate, tenta dar um flush. Outra coisa, a connection que vc ta usando para a instrução sql é a mesma da instrução via hibernate? Isso é obrigatório.

Obrigado Alberto pela pronta ajuda.

A connection é a mesma. porem como estava dando esse erro.

cabei dando commit antes de fazer a inserção na tabela B.

só que quando ele ia fazer a inclusão retornava connection is close.

quando eu dou commit ele fecha a conexao? estou fazendo dessa forma

conection c; c.transaction

c.begin;

insereRegistroViaHibernateTabelaA;

commit;

c.begin;

InsereRegistroTabelaBviaSql;

commit;

.... então poderia usar o flush no local do commit e caso desse algum erro inserir rollback no final? caso tenha outra forma melhor de fazer por favor me ajude.

É, eu chutaria com o flux. O commit não parece ser o que vc quer... pq vc pode acabar num estado inconsistente.

Muito obrigado.

1) O problema pode estar no relacionamento, como NÃO existe auto-relacionamento você deve fazer isso antes de salvar:

tabelaA.setFilho(tabelaB);
tabelaB.setPai(tabelaA);

2) Se não a opção 1 já existe, a solução pode ser completar a anotação OneToMany na classe TabelaA (aquela que você está tentando salvar). Assim o hibernate salva os 2.

@OneToMany(cascade = CascadeType.ALL)
List<TabelaB>  filhos;

Se resolveu, não deixe de marcar o tópico como concluído.