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 