Dúvia ao gravar um relacionamento no Hibernate

Pessoal,

Estou com a seguinte dúvida… Tenho duas tabelas no banco de dados (Pessoa / Endereco) onde uma pessoa pode ter 0 ou 1 endereco.

Minhas tabelas…

PESSOA ------------- ENDERECO
id_pessoa ---------- id_endereco
nome ------------- id_pessoa
telefone --------------rua

Meu código para gravar uma pessoa:

Pessoa p1 = new Pessoa(); p1.setNome("Joao"); p1.setEmail("xxx@xxx.com.br"); p1.setTelefone("xx.xxxx.xxxx"); sessao.save(p1); transacao.commit(); sessao.close();

Agora eu quero salvar um endereco junto com a pessoa.

Pessoa p1 = new Pessoa(); p1.setNome("Joao"); p1.setEmail("xxx@xxx.com.br"); p1.setTelefone("xx.xxxx.xxxx"); Endereco e1 = new Endereco(); e1.setRua("Rua Amarela"); e1.setId_pessoa(????); p1.setEndereco(e1); sessao.save(p1); transacao.commit(); sessao.close();

Minha dúvida está no ???. O que devo colocar como argumento no método setId_Pessoa? Esse valor tem que ser o valor da PK da minha pessoa, porem, esse valor é gerado automaticamente pelo banco depois do commit. Existe alguma forma de pegar esse valor do banco antes de gravar? Qual seria a melhor solução?

Valeu!

vinny767,

Se voce deixar null o setId_pessoa do objeto endereço eu axo q o hibernate entende o relacionamento entre eles e adiciona a chave depois de salvar o objeto pessoa nao?

ou então, o q vc pode fazer eh dar um save no objeto pessoa e em seguida dar um e1.setId_pessoa(pessoa.getKey()) e depois dar um save no objeto endereço.

Axo q essa segunda opção funciona, porém nao eh legal…

se vc conseguir fazer funcionar dando apenas um save no objeto pessoa, posta ae como vc fez q agora fiquei curioso :wink:

Cara… Consegui fazer. Não sei se está do jeito certo, mas tá gravando o relacionamento. Segue o Código.

[code]public static void main(String[] args){
Session sessao = HibernateUtility.getSession();
if(sessao != null){
Transaction transacao = sessao.beginTransaction();

         Pessoa p1 = new Pessoa();
         p1.setNome("Joao da Silva");
         p1.setEmail("jonh@techcenter.com.br");
         p1.setTelefone("xx.xxxx.xxxx");
         
         Endereco e1 = new Endereco();
         e1.setPessoa(p1);
         e1.setBairro("Centro");
         e1.setCep("000000-000");
         e1.setCidade("YYYYYYYY");
         e1.setComplemento("apto 00");
         e1.setEstado("Rio de Janeiro");
         e1.setNumero(97);
         e1.setRua("Rua Amarela");
         p1.setEndereco(e1);
                      
         sessao.save(p1);
         transacao.commit();
         sessao.close();         
      } else{
          JOptionPane.showMessageDialog(null, "sessao nula!");
      }   
      
      
  }

[/code]

opa,

legal q vc conseguiu fazer com apenas um save no objeto pessoa. Uma dúvida q tive: será q c vc tirar a linha e1.setPessoa(p1) tem o mesmo resultado no final? ou seja, irá salvar o endereço atribuindo a ele a chave do objeto pessoa?

pq nao sei c é necessário fazer o duplo relacionamento, tipo, colocar o objeto pessoa dentro do objeto endereço e o endereço dentro do pessoa, axo q c colocar o objeto filho dentro do objeto pai já funciona. Então neste seu caso vc colocando o objeto endereço dentro do objeto pessoa ja seria o suficiente…axo hehehehe

se vc puder fazer esse teste, seria interessante :smiley:

e valeu pelo post :slight_smile:

Cara… Tive a mesma duvida. Tirei e deu pau. Gravou so a Pessoa. Coloquei de volta e gravou a pessoa e o endereco. Acho que tem que manter o duplo relacionamento mesmo!

Abraço!

humm, entendi

bom, eu uma vez participei de um workshop de hibernate e lembro de ter feito um exemplo igualzinho ao seu…

amanha qndo chegar no trampo eu pego esse projeto e vejo como q tah lah no exemplo, se tah um objeto dentro do outro mesmo, mas pelos testes q vc fez deve ser isso mesmo

valeu ae pela resposta!!!

tendo mais dúvidas, posta ae q tentamos ajudar!

abraço!

Pode deixar! To cheio delas!!
Abraço!