Problemas Hibernate mapeamento

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

[code]@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;
}[/code]

Classe Cliente

[code]
@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;[/code]

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+

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…

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

opa amigo, muito obrigado pela ajuda.

o que fiz foi atribuir no construtor assim:

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

}[/code]

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 []

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+

[code]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 [][/code]

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

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.

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 []

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:

[code]@Override
public List 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 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;
}[/code]

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

Aconselho a usar um ManyToOne :smiley: