Tenho a seguinte situação
Tabela: usuario 1 ---- 1 usuarioSeguranca
CREATE TABLE seguranca.usuario(
cpf character varying(11) NOT NULL,
senha character varying(32) NOT NULL,
ad boolean NOT NULL DEFAULT false,
ativo boolean NOT NULL DEFAULT false,
nome character varying(50) NOT NULL,
PRIMARY KEY (cpf)
)
----
CREATE TABLE usuario
(
cpf character varying(11) NOT NULL,
rg character varying(15) NOT NULL,
endereco character varying(300) NOT NULL,
PRIMARY KEY (cpf),
FOREIGN KEY (cpf),
REFERENCES usuarioSeguranca (cpf)
)
Como vcs podem ver, na tabela usuário o campo cpf é tanto chave primaria como estrangeira, e se relaciona com a tabela usuarioSeguranca.
Pergunta como fazer o mapeamento ? de uma chave que é primaria e estrangeira ao mesmo tempo.
// tabela usuario
public class Usuario {
@Id
@OneToOne()
@JoinColumn(name="cpf",referencedColumnName="cpf")
private UsuarioSeguranca usuarioSeguranca;
// tabela usuarioSeguranca
@OneToOne(mappedBy="usuarioSeguranca")
private Usuario usuario;
Nunca achei que CPF ou CNPJ fossem boas chaves primárias.
A lenda diz que não podem existir dois CPFs iguais, porém, temos uma limitação no número de CPFs (sem contar a clonagem). Isso pode ocasionar duplicidade e, puts…
Eu prefiro criar uma coluna a mais, colocar um id incrementável ou identável ou sequencial (mysql, sql server ou oracle/postgres) e referenciar as relações desta maneira.
Assim, posso tratar de forma distinta e sem usar o cpf como PK ou ter a necessidade de uma chave composta.
Com relação à forma que você deve usar a anotação.
O relacionamento será unidirecional e o mapeamento será feito pela classe UsuarioSeguranca?
[quote=drsmachado]Nunca achei que CPF ou CNPJ fossem boas chaves primárias.
[/quote]
E não são mesmo.
- Se eu tenho dois clientes (um pai e um filho) é plenamente possível que o filho use o CPF do pai. (Quando fui abrir uma conta no Banco do Brasil para receber uma bolsa, há duzentos anos atrás, eu usei o CPF do meu pai.)
- Uma empresa pode ter vários CNPJs, um por filial (sabe aquele número 0001 que aparece no CNPJ? Pois é, aquilo é o número da filial. Então se alguma empresa tem várias fábricas ou filiais, ela pode ter vários CNPJs, mesmo assim você pode considerá-la como um único cliente.)