estou tendo problemas com o hibernate, no caso eu tenho 3 tabelas no meu banco de dados que sao: cliente, funcionario e endereco.
o meu problema eh q tanto a tabela funcionario como cliente referencia endereco, o problema acontece de quando eu vou recuperar algum desses objetos ele nao recupera o endereco corretamente, apenas pela ID do cliente se for 3 ele recupera o endereco com id 3, mas nem sempre vai ser igual, ja que tem funcionario pode ter adicionado antes, entenderam? como faco pra corrigir isso?
Faça uma modelagem decente. Sugiro uma tabela de relacionamento, já que pelo visto pode ser N x M, certo?
Abraço,
Armando
Hammer
o relacionamento esta OneToOne, na tabela cliente como funcionario tem um campo Endereco_ID, do qual so fica null mesmo eu adicionando um objeto de endereco atravez do metodo set tanto em cliente como em endereco, tb tem o campo ID que eh o campo principal, se o id do objeto cliente q eu kiser deletar for 5, ele deleta o endereco com o id 5 tb, mas nem sempre vai ser igual, e ele deleta o errado.
Hammer
alguma ajuda?
Hammer
alguem ajuda pois estou ficando doido ja aq tentando d td e nao conseguindo.
rodrigoallemand
Coloque o código dos mapeamentos pra ficar mais claro!
privateintID;privateStringnome;privateStringdataEntradaIES;privateStringIES;privateinttelefone;privateintcelular;privateStringemail;privateStringpagPessoal;privateStringareaInteresse;privateStringareaAtuacao;privateStringcurriculo;privateStringfuncao;privateStringprojetos;privateEnderecoendereco;//referencia para outra tabela publicColaborador(){}@Id@Column(name="ID")publicintgetID(){returnthis.ID;}publicvoidsetID(intID){this.ID=ID;}@Column(name="nome")publicStringgetNome(){returnthis.nome;}publicvoidsetNome(Stringnome){this.nome=nome;}@Column(name="dataEntradaIES")publicStringgetDataEntradaIES(){returnthis.dataEntradaIES;}publicvoidsetDataEntradaIES(StringdataEntradaIES){this.dataEntradaIES=dataEntradaIES;}@Column(name="IES")publicStringgetIES(){returnIES;}publicvoidsetIES(StringIES){this.IES=IES;}@Column(name="telefone")publicintgetTelefone(){returnthis.telefone;}publicvoidsetTelefone(inttelefone){this.telefone=telefone;}@Column(name="celular")publicintgetCelular(){returnthis.celular;}publicvoidsetCelular(intcelular){this.celular=celular;}@Column(name="email")publicStringgetEmail(){returnthis.email;}publicvoidsetEmail(Stringemail){this.email=email;}@Column(name="pagPessoal")publicStringgetPagPessoal(){returnthis.pagPessoal;}publicvoidsetPagPessoal(StringpagPessoal){this.pagPessoal=pagPessoal;}@Column(name="areaInteresse")publicStringgetAreaInteresse(){returnthis.areaInteresse;}publicvoidsetAreaInteresse(StringareaInteresse){this.areaInteresse=areaInteresse;}@Column(name="areaAtuacao")publicStringgetAreaAtuacao(){returnthis.areaAtuacao;}publicvoidsetAreaAtuacao(StringareaAtuacao){this.areaAtuacao=areaAtuacao;}@Column(name="curriculo")publicStringgetCurriculo(){returnthis.curriculo;}publicvoidsetCurriculo(Stringcurriculo){this.curriculo=curriculo;}@Column(name="funcao")publicStringgetFuncao(){returnthis.funcao;}publicvoidsetFuncao(Stringfuncao){this.funcao=funcao;}@Column(name="projetos")publicStringgetProjetos(){returnthis.projetos;}publicvoidsetProjetos(Stringprojetos){this.projetos=projetos;}@OneToOne(cascade=CascadeType.ALL,fetch=FetchType.LAZY)@JoinColumn(name="Endereco_ID")publicEnderecogetEndereco(){returnthis.endereco;}publicvoidsetEndereco(Enderecoendereco){this.endereco=endereco;}
bem, aquele erro nao existe mais nesse codigo q postei, pois nao posso compartilhar as mesmas fk se nao acaba acontecendo o problema ja mencionado, o erro q acontece agora, eh q o campo Endereco_ID fica sempre 0, oque era pra ficar com o id do objeto endereco, oq acontece eh q nao consigo mais deletar pois ele nao axa o objeto relacionado com o id 0 q nao existe, como faco pra consertar isso?
Hammer
estou enviando o codigo mysql tb caso ajude, mas axo q o erro nao esta aq
minha duvida eh a seguinte, qd eu adiciono um novo cliente ou funcionario(colaborador) ele sempre adiciona no campo endereco_ID o valor 0,era pra ficar o valor ID d endereco, como faco isso?
Hammer
ninguem se habilita? to precisando com urgencia.
cv1
Urgencia eh com o 190 ou 192.
Hammer
aff cara, se nao ksier ajudar nao atrapalha, to ate agora tentando aq, lendo as referencias dos annotations do hibernate q eu peguei e nao to conseguindo, to lendo hibernate in action, me ajudaram mt, mas so falta isos pra mim e nao to conseguindo.
georgesq
olha só, crie o relacionamento tanto do pai para o filho quanto o inverso, e no filho na insersão vc coloca o proprio pai dentro dele que vai funcionar, aqui fiz assim e esta rodando.
Hammer
mt obg pela ajuda, tentei fazer oq vc me disse mas nao estou conseguindo, pode me dar uma ajuda?
Hammer
so pra dar um up no topico pq estou precisando mt
Hammer
ninguem sabe qual eh o problema? nao to conseguindo aq.
Hammer
estou quase terminando o projeto na interface grafica, so vai faltar isso agora, alguem me ajuda?
joaosouza
Olá Hammer, não sei se vai te ajudar, pois quando trabalhei com Hibernate foi com a versão 3.1, onde eu configurava o hibernate.cfg.xml para o mapeamento das classes e um arquivo NomeDaClasse.hbm.xml mapeando os atributos da classe e seus relacionamentos. Abaixo um exemplo simples:
Nesse exemplo tenho uma classe Objeto que está relacionanda com a classe Status, sendo que cada Objeto tem q ter um status. Então no arquivo Objeto.hbm.xml q mapeia a classe Objeto acrescento o código abaixo para efetuar esse relacionamento com a coluna idstatus da tabela status.
oq eu gostaria era q o campo Endereco_ID na classe cliente por exemplo tivesse o mesmo valor id da classe endereco, isso sao os valores da tabela, como q eu faco isso?
Hammer
alguma sugestao para isso?
E
ezellis
vamos ver se eu entendi
vc tem uma tabela funcionario que tem um campo id (q provavelmente de ser uma pk)
na tabela de endereço vc tem um campo endereco_id que vai conter o id do funcionario, ou seja, é uma fk
cara não sei como esta seu código para fazer a persistência, mas acho q vc primeiro deve persistir o funcionário, pois só depois desse passo vc vai ter o id do seu funcionário e depois deve persistir o endereço
espero que funcione e boa sorte
Hammer
tava vendo isso na net, mas eh assim:
na minha tabela funcionario tem Endereco_ID, eh em funcionario isso, esse campo deve conter o ID do endereco desse funcionario, o problema eh q esse campo fica sempre 0. como eu poderia fazer isso? persisitir primeiro endereco? e depois funcionario? seria isso?
herbertins
cara vc vai ter que persistir primeiro o funcionario, depois vai consultar esse funcionario e pegar a PK dele e depois quando persistir o endereço vc vai colocar a pk do funcionario no lugar de Endereço_Id
E
ezellis
agora entendi, então é isso mesmo vc deve persistir primeiro o endereço, pois vai ser gerado o id do endereco e depois pesistir o funcionaio.
como vc vai fazer isso?
seguinte, vc deve ter uma classe q representa o endereco certo, então depois de aberta a conexão com o banco instancie o endereco, carregue-o e persista ele (session.save(endereco) acho que isso…) depois instancie o funcionário, carregue-o e persita ele. não se esquece que no seu arquivo de mapeamneto deve ter o relacionamento entre as tabelas.
acho q o caminho é esse mesmo, não me lembro direito das sintaxes, mas me lenmbro que quando estava fazendo execircios de um tutorial encontrado aqui no GUJ http://www.guj.com.br/java.tutorial.artigo.174.1.guj
tive um problema bem parecido e apanhei um bocado até perceber que era isso
espero ter ajudado e boa sorte
Hammer
entao eu devo persistir primeiro o endereco para q e saiba qual o id dele para colocar em funcionario no campo Endereco_ID certo?
me desculpe mas sou novato, esse eh meu primeiro projeot utilizando o hibernate, mas gostaria de saber o que eh esse arquivo de mapeamento, e so pra avisar eu estou usando o annotations do hibernate q parece q nao precisa disso, eu dou apenas um @JoinColumn(Endereco_ID).
axo q desse jeito persistir um e depois o outro da certo, mas gostaria de saber como vou colocar esse inteiro no campo endereco_ID em funcionario ja q esse campo na minha classe eh uma referencia ao objeto Endereco.
Hammer
UP
E
ezellis
cara tbem sou novato, mas como dei uma estudada no tutorial que te passei e tive o problema parecido te dei esses toques (q tbem não sei se vai resolver, mas acho que temos q nos ajudar, pq tbem aprendemos juntos…).
O arquivo de mapeamento seria um arquivoxml onde vc mapeia os campos da tabela para os atributos o objeto, mas vc esta usando annotation.
Não sei mas acredito que devido ao relacionamento depois q vc persistir o endereço vc concegue obter o id sem ter q fazer uma nova consulta.
Depois de "pegar " o id vc o coloca na sua classe funcionario no atributo end_id e persiste.
Cara vou acompanhar seu post para saber se conseguiu (e aproveitar ir aprendendo mais sobre o hibernate), espero ter ajudado com o pouco que conheço
boa sorte
Hammer
mt obg cara, e vc deveria tentar usar o annotation pois facilita mt o trabalho da gente, e realmente isso q vc falou eh verdad, posso conseguir o id sem fazer uma nova consultar depois q persistir o endereco, ja vi isso aq no forum, vou ver como faco isso e depois retorno aq, minha unica pergunta eh como vou colocar esse id em endereco_ID em funcionario, ja q ele recebe retorna um objeto da classe endereco.
axo q vou ter q criar um novo campo na classe q seja um inteiro e q seja mapeado tb por Endereco_ID, axo q pode dar certo, hj pela manha vou tentar fazer isso.
V
victorpriest
para persistir nesse caso, vc pode fazer algo assim…
vc tem um objeto q é o funcionário… vamos chamá-lo de func
esse idendereco é o q vc acabou de persistir…
espero ter ajudado
Hammer
tava pesquisando mas nao to conseguindo, axo q se eu conseguir isso resolve o meu problema, to kerendo saber como recuperar o id qd eu persisto um objeto no banco de dados sem fazer uma nova consulta, alguem poderia me explicar?
terminei todo o mue projeot so falta isso. =/
Hammer
UP
Hammer
ja vi isso q eu to kerendo por aq no forum mas nao estou conseguindo, axo q eh uma coisa simples, alguem pode me ajudar?
Hammer
por favor alguem me responda so isso q axo q consigo, peskisei na net so q nao estou conseguindo fazer.
o meu metodo save teria dois argumentos agora, o funcionario e endereco, eu salvo endereco primeiro guardando o id dele e antes d salvar funcionario coloco esse numero no campo Endereco_ID, eu axo q assim ta legal.
mas, como recuperar a id na hora de salvar sem fazer uma nova busca?
Hammer
alguem sugestao? alguem pode me ajudar? to pesquisando mt mas nao to conseguindo axo q alguem daq ja passou por isso e pode me ajudar
plentz
Hammer, pare de ficar postando mensagens somente para subir o tópico. Coloque sua dúvida, mas nao fique de braços cruzados. Se esforce um pouco e tente achar a resposta sozinho.
Hammer
cara, nao fale doq vc nao sabe, estou pesquisando feito um louco, essa madrugada eu nem dormi tentando fazer isso e pesquisando na net, estou me esforcando e mt, se vc nao sabe a respostada minha duvida nao venha falar mau ao meu respeito pq nao estou de bracos cruzados nao, mt pelo contrario, estou me esforcando e mt, dispenso os seus comentarios.
plentz
Que bom que está se esforçando. Mas a colocação sobre não ficar colocando mensagens somente para subir o tópico permanece. E esse assunto morre aqui.