Problemas Hibernate mapeamento

11 respostas
C

Pessoal, andei pesquisando sobre a solução aqui no fórum e não encontrei daí resolvi postar.

Tenho uma classe cliente e uma endereço, qual no momento que insiro um cliente no banco, o endereço deve ir junto setando o cpf do cliente(FK) como id na tabela de endereço.
mas no momento em que executo o método o seguinte erro aparece: [color=red]ids for this class must be manually assigned before calling save(): br.com.carlos.cliente.Endereco[/color]
Primeiramente eu crio um objeto do tipo endereço e após isso, crio um cliente, passando o obj endereço dentro dele.

Segue os mapeamentos dentro das classes..

Classe Endereço
@Entity
@Table(name = "tb_endereco")
public class Endereco {

	@Id
	@Column(name = "tb_cliente_cpf")
	private String clienteCpf;

	public String getClienteCpf() {
		return clienteCpf;
	}

	public void setClienteCpf(String clienteCpf) {
		this.clienteCpf = clienteCpf;
	}
Classe Cliente
@Entity
@Table(name="tb_cliente")
public class Cliente {

	@Id
	@Column (name="cpf")
	private String cpf;

	@Column (name="nome")
	private String nome;
	
	
	/**
	 * Mapeamento 1:1 para Endereco
	 */
	@OneToOne(cascade = CascadeType.ALL)
	@PrimaryKeyJoinColumn
	private Endereco cEndereco;

11 Respostas

A

cara,

clienteCpf nao vai ser PK na sua entidade e sim FK, entao vc tem que remover ele dai, provavelmente vc vai ter outra PK no tabela endereco.

t+

C

Amigo,

você quer dizer que não posso ter uma PK(que é o cpf na tabela cliente) e a FK(cpf do cliente na tabela endereço)?

desculpa se eu não entendi, mas é que realmente iniciei a pouco os tipos de mapeamento no hibernate…

A

vc vai ter um FK (cpf) na tabela de Endereço que se refere a um cliente.

C

opa amigo, muito obrigado pela ajuda.

o que fiz foi atribuir no construtor assim:

public Cliente(String nome, String cpf, Endereco cEndereco) {
		cEndereco.setClienteCpf(cpf);
		this.nome = nome;
		this.cpf = cpf;
		this.cEndereco = cEndereco;

	}
adriano_si

Cara, como é o seu relacionamento ??? 1 - 1 ou 1 - N ???

Isso é importante, pois você tem anotações que funcionam para você deixar teu Modelo OR bem coeso.

Não terás na tabela de Endereço a coluna do CPF do cliente mapeada, se for assim, não precisa relacionamento de tabelas, controlas isso via app.

Acho que o que queres é mapear o Enreco dentro de Cliente não ???

Explica teu cenário melhor.

Abs []

A

cara,

vc nao vai ter esse atributo clienteCpf na Classe Endereco.
o que vc tem q entender é o seguinte, um Cliente TEM um Endereco, entao vc sabe qual o endereco de cada cliente.

t+

mausexdd
Cara, como é o seu relacionamento ??? 1 - 1 ou 1 - N ??? 

Isso é importante, pois você tem anotações que funcionam para você deixar teu Modelo OR bem coeso. 

Não terás na tabela de Endereço a coluna do CPF do cliente mapeada, se for assim, não precisa relacionamento de tabelas, controlas isso via app. 

Acho que o que queres é mapear o Enreco dentro de Cliente não ??? 

Explica teu cenário melhor. 

Abs []

Foi como nosso amigo disse , não tem porque voce utilizar 1-1 , quer dizer que 2 pessoas que moram na mesma casa , não podem ser cadastradas no seu sistema como clientes?
Explique melhor o cenario da sua aplicação , para que fique mais claro e mais facil de ajudar.

Boa Sorte

C

Bem, a questão foi do professor ter instruido criar este relacionamento, devido ele ter passado o banco praticamente feito com as tabelas e relacionamentos prontos.

Entendo que o relacionamento poderia ser 1 - N (endereço para vários clientes).
Mas o relacionamento solicitado foi 1-1 via annotation.

adriano_si

Só uma pergunta… Porque não estás mapeando o @OneToOne de endereço para cliente tbm ??

Dá uma olhada na DOC do Hibernate Annotations cara. Lá tem um exemplo claro, está faltando besteira pra vc terminar…

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/

Abs []

C

opa cara, obrigado pelas dicas. estou indo para casa e vou dar uma lida mais calma.
qualquer coisa eu posto ainda hoje tirando duvidas..

-----------------------------------

inclusive, quando estou chamando um método para listar as contas do meu banco dessa forma:

@Override
	public List<Conta> listarConta() throws ErroAcessoRepositorioException {
		Transaction tx;
		if(session.isOpen()) {
			tx = session.beginTransaction();
		} else {
			session = HibernateUtil.getSession();
			tx = session.beginTransaction();
		}
		Query q = session.createQuery("from Conta");
		System.out.println(q.getQueryString());
		List<Conta> contas = q.list();
		
		for (Conta c : contas) {
			System.out.println("Cpf do Cliente: " + c.getCliente().getCpf());
			System.out.println("Número: " + c.getNumero());
			System.out.println("Saldo: " + c.getSaldo());
		}
		return contas;
	}

ele gera um HQL setando um parametro no final qual eu não quero, e sim trazer todas as contas

HQL gerado: Hibernate: select conta0_.id as id1_, conta0_.tb_cliente_cpf as tb5_1_, conta0_.numero as numero1_, conta0_.saldo as saldo1_ from tb_conta conta0_ where conta0_.tipo=1

eu preciso que ele traga todas as contas do banco, sem precisar especificar qual o tipo de conta. gostaria de saber como posso tratar isto

Diguinho.Max

Aconselho a usar um ManyToOne :smiley:

Criado 21 de outubro de 2011
Ultima resposta 28 de out. de 2011
Respostas 11
Participantes 5