Chave Primária

25 respostas
wicketando

Galera, é o seguinte:

Eu tenho uma tabela PESSOA e FUNCIONARIO que se relacionam com cardinalidade 1:1.

A entidade FUNCIONARIO recebe o COD_PESSOA. E esse COD_PESSOA é chave primária tbm na FUNCIONARIO.

Como faço pra mapear a chave primária na classe Funcionario?

@Entity
@Table(name="FUNCIONARIO")
public class Funcionario implements java.io.Serializable{

    @Id
    @OneToOne
    private Pessoa pessoa;

Da maneira que estou fazendo dá pau. Porque, creio eu, não posso definir um objeto como chave primária. Como resolver isso?

25 Respostas

Hebert_Coelho

Utilize a @JoinColum na classe que for ter a chave estrangeira

wicketando

Eu utilizo a JoinColumn. O problema é o seguinte:

Eu tenho uma FK na tabela FUNCIONARIO, que recebe a chave primária de PESSOA.

Essa FK de FUNCIONARIO é tbm a chave primária de FUNCIONARIO.

Como faço isso?

Hebert_Coelho

Tenta com o @PrimaryKeyJoinColumn então.

Hebert_Coelho

C ta falando que o ID da funcionário é o ID da pessoa como chave estrangeira?

wicketando

Sim…o ID de Funcionario é o ID de Pessoa como chave estrangeira.

douglascst90

@OneToOne @JoinColumn(name = "ID_PESSOA") private Pessoa pessoa;

tenta anotações!

Hebert_Coelho
douglascst90:
@ManyToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PESSOA")
private Pessoa pessoa;

ou

@OneToOne(fetch = FetchType.EAGER)
@JoinColumn(name = "ID_PESSOA")
private Pessoa pessoa;

tenta um dessas anotações!

Cara, me desculpe. ManyToOne? O relacionamento dele é OneToOne.

Outra coisa @OneToOne(fetch = FetchType.EAGER) pra q? O default já eh EAGER.

douglascst90

hehehe desculpe nao tinha prestado atenção, arrumado!

wicketando

Galera, estou tentando anotação.

@Id @OneToOne @JoinColumn(name = "COD_PESSOA") private Pessoa pessoa;

Quando tento assim, dá pau.

Talvez eu tenha que usar um embededId, não sei. Preciso de ajuda.

douglascst90

voce precisa gravar na tabela usuario o id de pessoa? Sendo que ele seja primaria na tabela usuario?

Hebert_Coelho

jakefrog:
Tenta com o @PrimaryKeyJoinColumn então.
Você tentou?

wicketando

Eu preciso gravar na tabela FUNCIONARIO o ID de PESSOA. Sendo ele PK na tabela FUNCIONARIO.

Vou tentar com o @PrimaryKeyJoinColumn

Hebert_Coelho

Cara, eu to olhando o livro aqui e ele dá um exemplo exatamente no seu caso:

wicketando

Tentei. O erro foi o seguinte: No identifier specified for entity: br.com.testes.model.Funcionario

Hebert_Coelho

Tentei. O erro foi o seguinte: No identifier specified for entity: br.com.testes.model.FuncionarioVc mapeou suas classes com Entity? Todas tem @Id? Você está utilizando interfaces? Esse exemplo que eu passei acima funciona. Está igual a esse exemplo?

douglascst90

jakefrog, ele nao precisa referenciar a coluna??

wicketando

jakefrog:
Cara, eu to olhando o livro aqui e ele dá um exemplo exatamente no seu caso:

Que livro é esse?

wicketando

jakefrog:
Cara, eu to olhando o livro aqui e ele dá um exemplo exatamente no seu caso:

Cara, no livro tanto Employee quanto ParkingSpace possui um ID.

No meu caso, o ID de employee, por exemplo, seria um ParkingSpace. Essa é a diferença.

Hebert_Coelho

douglascst90:
jakefrog, ele nao precisa referenciar a coluna??
Não pois são chave primárias diretas.
Ele mesmo responde sua pergunta logo abaixo do codigo:

Hebert_Coelho

Ok, o livro é esse aqui: http://books.google.com.br/books/about/Pro_EJB_3.html?hl=pt-BR&id=fVCuB_Xq3pAC perto da página 90.

É free no google. [=

wicketando

Jakefrog,

pelo que entendi:

a minha classe Funcionario tera um @Id que é o mesmo da Pessoa e terá um @PrimaryKeyJoinColumn:

@Id
private Integer codPessoa;

@OneToOne
@PrimaryKeyJoinColumn
private Pessoa pessoa;

Na entidade Funcionário, terei apenas um atributo COD_PESSOA.

É isso?

Hebert_Coelho
wicketando:
Jakefrog,

pelo que entendi:

a minha classe Funcionario tera um @Id que é o mesmo da Pessoa e terá um @PrimaryKeyJoinColumn:

@Id
private Integer codPessoa;

@OneToOne
@PrimaryKeyJoinColumn
private Pessoa pessoa;

Na entidade Funcionário, terei apenas um atributo COD_PESSOA.

É isso?

Eu faria desse modo. [=
E não esqueça de colocar o mappedBy. [=

OBS.: troca de Integer para int, vai evitar muita dor de cabeça. [=

wicketando
jakefrog:
wicketando:
Jakefrog,

pelo que entendi:

a minha classe Funcionario tera um @Id que é o mesmo da Pessoa e terá um @PrimaryKeyJoinColumn:

@Id
private Integer codPessoa;

@OneToOne
@PrimaryKeyJoinColumn
private Pessoa pessoa;

Na entidade Funcionário, terei apenas um atributo COD_PESSOA.

É isso?

Eu faria desse modo. [=
E não esqueça de colocar o mappedBy. [=

OBS.: troca de Integer para int, vai evitar muita dor de cabeça. [=

o mappedBy eu coloco na tabela PESSOA recebendo um Funcionário, certo?

Pq vc acha que o Integer dá muita dor de cabeça? Qual seria a diferença entre os dois?

Hebert_Coelho

mappedBy você coloca em quem não terá o @PrimaryKeyJoinColumn .

Com int você sempre terá o default como 0, com Integer você terá null.

id como Integer = null é grande chance de se ter nullpointer exception.

E tem outros frameworks que vão se zangar tb. ^^

wicketando

jakefrog:
mappedBy você coloca em quem não terá o @PrimaryKeyJoinColumn .

Com int você sempre terá o default como 0, com Integer você terá null.

id como Integer = null é grande chance de se ter nullpointer exception.

E tem outros frameworks que vão se zangar tb. ^^

Só pra deixar esclarecido:

em uma relação normal, basta anotarmos o tipo de relação, por exemplo @ManyToOne e @JoinColumn, certo?

Neste caso específico, em q a FK é tbm a PK.

teremos um @Id com o chave primária da tabela PESSOA e @PrimaryKeyJoinColumn com a tabela em si.

certo?

Criado 26 de março de 2012
Ultima resposta 26 de mar. de 2012
Respostas 25
Participantes 3