Transação banco de dados em JPA

5 respostas
josimarsis

Olá galera a minha duvida é a seguite: Tenho 2 tabelas Endereço e Empresa, uma empresa tem um endereço. Até ai tudo bem estou usando jpa desta forma estou fazendo da seguinte maneira:

1° Preencho o beanEnderco
2° Salvo o beanEndereco
3° Realizo uma consulta que traz o codigo do ultimo endereço cadastrado
4° com base no codigo do ultimo enderço cadastrado faço uma consulta e preencho o campo codEnderco da tabela
Empresa (Este campo é chave estrangeira e recebe um objeto beanEnderco populado)
5° Preencho o restante das informações referentes ao beanEmpresa
6° Salvo o beanEmpresa

isso tudo funciona perfeitamente, porem eu queria realizar tudo isso dentro de uma transação, mas sem dar um commit(); eu não consigo fazer um Select Max na tabela de endereço. A ideia de usar a transação neste caso seria para caso ocorresse erro na insersão ou do beanEnderco ou do beanEmpresa eu daria um rollback e nada aconteceria.

Existe algum meio de fazer um select max dentro da transação sem dar um commit() ?

5 Respostas

renanreismartins

nao ha necessidade de td isso…

anote o atributo endereco da classe empresa com:

cascade = CascadeType.ALL

preencha os beans e faça simplismente

empresa.setEndereco(endereco);
em.persist(empresa);

ele salvara td em uma transacao soh…

vinny767

Desta forma, você está lidando com ID’s, Chaves, etc… Não está lidando com a Orientação a Objetos como deveria.
Seu Bean Emrpesa deve possuir um atributo Endereço, como

private Endereco endereco

Se a empresa já está persistente no BD, recupere o registro, preencha o Bean de Endereço e dê um

empresa.setEndereco(objEndereco)

mande gravar e pronto. Agora sim seu código está Orientado a Objetos!
Abraço!

vinny767

Você não precisa cadastrar os dois objetos no banco, recurperar os dois e setar um no outro. Essa é a ideia.

josimarsis

Galera eu testei aqui com

cascade = CascadeType.ALL

Funcionou mas quando mando remover ele não respeita a integridade referencial do banco e exclui tudo:

veja a situação:

Tabela Telefone: (Uma empresa pode ter varios numeros de Telefone) ou seja pra cada telefone de uma empresa
eu tenho um registro com o codEmpresa.

Tabela Empresa: (Uma empresa tem um Endereço), dentro da tabela empresa eu tenho o codEndereco

Tabela Endereco;

Se a Empresa X tem 1 numero de telefone e eu removo este numero a empresa e o endereço são apagados, no meu entendimento isso so poderia ocorrer se eu apagasse primeiro o endereço depois a empresa e por ultimo o telefone.

Pesquisei o dia todo na net sobre os tipos
cascade = CascadeType e não consegui entender como funcionam

Alguma dica?

renanreismartins

tente:

cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH}

abrassss

Criado 7 de junho de 2009
Ultima resposta 1 de jul. de 2009
Respostas 5
Participantes 3