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
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
e valeu pelo post
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!