Problemas com o hibernate

41 respostas
Hammer

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?

41 Respostas

emmanuel.silva

E como está o seu mapeamento?

A

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!

Hammer

package entity;

import javax.persistence.CascadeType;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.FetchType;

import javax.persistence.Id;

import javax.persistence.OneToOne;

import javax.persistence.Table;

import javax.persistence.JoinColumn;
@Entity

@Table(name = colaborador)

public class Colaborador implements java.io.Serializable {
private int ID;	 
private String nome;	 
private String dataEntradaIES;	 
private String IES;	 
private int telefone;
private int celular;	 
private String email;	 
private String pagPessoal;	 
private String areaInteresse;	 
private String areaAtuacao;	 
private String curriculo;	 
private String funcao;	 
private String projetos;	
private Endereco endereco; 	//referencia para outra tabela 
 
public Colaborador() {
	
}

@Id
@Column(name = "ID")
public int getID() {
	return this.ID;
}

public void setID(int ID) {
	this.ID = ID;
}

@Column(name = "nome")
public String getNome() {
	return this.nome;
}

public void setNome(String nome) {
	this.nome = nome;
}
	 
@Column(name = "dataEntradaIES")
public String getDataEntradaIES() {
	return this.dataEntradaIES;
}

public void setDataEntradaIES(String dataEntradaIES) {
	this.dataEntradaIES = dataEntradaIES;
}

@Column(name = "IES")
public String getIES() {
	return IES;
}

public void setIES(String IES) {
	this.IES = IES;
}
 
@Column(name = "telefone")
public int getTelefone() {
	return this.telefone;
}

public void setTelefone(int telefone) {
	this.telefone = telefone;
}

@Column(name = "celular")
public int getCelular() {
	return this.celular;
}

public void setCelular(int celular) {
	this.celular = celular;
}

@Column(name = "email")
public String getEmail() {
	return this.email;
}

public void setEmail(String email) {
	this.email = email;
}

@Column(name = "pagPessoal")
public String getPagPessoal() {
	return this.pagPessoal;
}

public void setPagPessoal(String pagPessoal) {
	this.pagPessoal = pagPessoal;
}
 
@Column(name = "areaInteresse")
public String getAreaInteresse() {
	return this.areaInteresse;
}

public void setAreaInteresse(String areaInteresse) {
	this.areaInteresse = areaInteresse;
}

@Column(name = "areaAtuacao")
public String getAreaAtuacao() {
	return this.areaAtuacao;
}
 
public void setAreaAtuacao(String areaAtuacao) {
	this.areaAtuacao = areaAtuacao;
}
 
@Column(name = "curriculo")
public String getCurriculo() {
	return this.curriculo;
}

public void setCurriculo(String curriculo) {
	this.curriculo = curriculo;
}

@Column(name = "funcao")
public String getFuncao() {
	return this.funcao;
}
 
public void setFuncao(String funcao) {
	this.funcao = funcao;
}
 
@Column(name = "projetos")
public String getProjetos() {
	return this.projetos;
}

public void setProjetos(String projetos) {
	this.projetos = projetos;
}
 

@OneToOne(cascade = CascadeType.ALL, fetch = FetchType.LAZY)
@JoinColumn(name = "Endereco_ID")
public Endereco getEndereco() {
	return this.endereco;
}

public void setEndereco(Endereco endereco) {
	this.endereco = endereco;
}

}

Hammer

package entity;

import javax.persistence.Column;

import javax.persistence.Entity;

import javax.persistence.Id;

import javax.persistence.Table;
@Entity

@Table(name = endereco)

public class Endereco implements java.io.Serializable {
private int ID;
private String rua;	 
private int numero;	 
private String complemento;	 
private String bairro;	 
private String cidade;	 
private String estado;

public Endereco() {
	
}

@Id
@Column(name = "ID")
public int getID() {
	return this.ID;
}

public void setID(int ID) {
	this.ID = ID;
}

@Column(name = "rua")
public String getRua() {
	return this.rua;
}
 
public void setRua(String rua) {
	this.rua = rua;
}

@Column(name = "numero")
public int getNumero() {
	return this.numero;
}
 
public void setNumero(int numero) {
	this.numero = numero;
}
 
@Column(name = "complemento")
public String getComplemento() {
	return complemento;
}

public void setComplemento(String complemento) {
	this.complemento = complemento;
}

@Column(name = "bairro")
public String getBairro() {
	return bairro;
}
 
public void setBairro(String bairro) {
	this.bairro = bairro;
}
 
@Column(name = "cidade")
public String getCidade() {
	return cidade;
}

public void setCidade(String cidade) {
	this.cidade = cidade;
}

@Column(name = "estado")
public String getEstado() {
	return this.estado;
}
 
public void setEstado(String estado) {
	this.estado = estado;
}

}

Hammer

s ai esta a parte da funcao pra deletar da classe ColaboradorHibernateDAO

public void remover(Colaborador colaborador) {

session = ConnectDB.getInstance();

Transaction tx = null;
try {
		tx = session.beginTransaction();
		session.delete(colaborador);
		tx.commit();
	}
	
	catch(HibernateException e) {
		e.printStackTrace();
	}
	finally {
		session.close();
	}
}
Hammer

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

CREATE TABLE endereco (

ID INTEGER NOT NULL,

rua VARCHAR(100) NULL,

numero INTEGER NULL,

complemento VARCHAR(20) NULL,

bairro VARCHAR(30) NULL,

cidade VARCHAR(30) NULL,

estado CHAR(2) NULL,

PRIMARY KEY(ID)

);
CREATE TABLE colaborador (

ID INTEGER NOT NULL,

Endereco_ID INTEGER NOT NULL,

nome VARCHAR(45) NOT NULL,

dataEntradaIES VARCHAR(10) NOT NULL,

IES VARCHAR(45) NOT NULL,

telefone INTEGER NULL,

celular INTEGER NULL,

email VARCHAR(100) NULL,

pagPessoal VARCHAR(200) NULL,

areaInteresse VARCHAR(255) NOT NULL,

areaAtuacao VARCHAR(255) NOT NULL,

curriculo VARCHAR(255) NULL,

funcao VARCHAR(45) NOT NULL,

trabalhosRealizados TEXT NULL,

projetos VARCHAR(200) NULL,

PRIMARY KEY(ID),

FOREIGN KEY(endereco_ID)

REFERENCES endereco(ID)

ON DELETE NO ACTION

ON UPDATE NO ACTION

);
Hammer

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.

<many-to-one name="status" column="idstatus" class="br.com.teste.teste1.bean.Status" lazy="false"/>

Espero que tenha te ajudado, e não atrapalhado. :slight_smile:

Hammer

vlw pela ajuda cara mas nao to conseguindo ainda…

Hammer

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

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

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

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

para persistir nesse caso, vc pode fazer algo assim…
vc tem um objeto q é o funcionário… vamos chamá-lo de func

func.setEndereco(new Endereco());
func.getEndereco().setId(idendereco);

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.

Criado 15 de janeiro de 2007
Ultima resposta 13 de fev. de 2007
Respostas 41
Participantes 11