[RESOLVIDO]Mapeamento JPA - Como mapear uma PK que é FK ao mesmo tempo
17 respostas
R
rcafalchio
Fala galera, andei pesquisando mais não encontrei solução.
A minha dúvida é o seguinte, tenho 2 tabelas, empresa e usuario, porém na tabela empresa minha pk é o codigo_usuario que vem da tabela usuario, ou seja uma fk, no mysql consegui fazer isso sem problemas, mas quando crio a entidade ele me fala que não existe identificador na tabela empresa.
Alguém já passou por isso ou chuta alguma solução?
Cara, desculpe a ignorância, mas sempre utilizei embeddableId para chave composta, não entendi como vai funcionar para pk/fk.
Pode dar um exemplo de como ficaria.
Obrigado.
wagnerfrancisco
Se eu entendi bem, você tem um campo codigo_usuario na tabela empresa que referencia o campo codigo_usuario da tabela usuario (fk). Neste caso, tente assim:
Nesse caso sua tabela empresa tem uma coluna chamada codigo_usuario que referencia o codigo_usuario da tabela Usuario. O mapeamento @OneToOne serve apenas para poder carregar o usuario da empresa
Falou.
R
rcafalchio
Wagner,
Eu até cheguei a fazer isso , mas minha dúvida é na tabela empresa, pois quando eu subo o JBOSS aparece um erro dizendo que não exite ID para tabela empresa.
Se não tem que aparecer esse erro, como ficaria a tabela empresa?
Abraço!
wagnerfrancisco
Para o mapeamento que eu falei, basta a tabela empresa ter um campo chamado codigo_usuario, uma restrição de PK e uma foreign key apontando pra tabela usuario.
Bota os campos relevantes das tuas tabelas aí pra gente ver como deve ficar.
o problema agora ta sendo na persistencia, ta dizendo que a empresa está transiente, o que é verdade, porem era pra gerar o mesmo código de usuário que gera pra entidade usuário.
Tem alguma ideia como resolver?
Agradeço desde já.
object references an unsaved transient instance - save the transient instance before flushing: com.leilaopecuario.entidades.Usuario.empresa -> com.leilaopecuario.entidades.Empresa
wagnerfrancisco
Eu fiz um exemplo e percebi o problema. Consegui resolver desta maneira:
Deu certinho aqui, vê aí como ficou. Agora, este mapeamento é estranho… hehe, eu criaria uma fk se pudesse, mas sei que as vezes não dá pra mexer no banco
R
rcafalchio
Wagner,
Fiz exatamente isso, mas ta dando o seguinte erro:
null id generated for:class com.leilaopecuario.entidades.Empresa
Eu posso mexer no banco sim, mas queria usar uma pk/fk para forçar o usuário ter só um endereço, assim não tendo que criar uma chave na tabela endereço.
Só pra checar, você associou a entidade ao usuário e o usuário à entidade? Assim:
Usuariou1=newUsuario();u1.setDescricao("theUser");Empresae1=newEmpresa();e1.setDescricao("theCompany");u1.setEmpresa(e1); // setando usuario da empresae1.setUsuario(u1); // e empresa do usuario
Veja se isso resolve, eu tb tive algum problema assim e era isso que faltava…
O GenericGenerator no caso é pra isso mesmo. No parâmetro nós especificamos que o id virá da propriedade usuario. Eu acredito que tenha até mais possibilidades, definir geradores customizados e coisas do gênero, mas confesso que aí já não entendo mais… hehe
R
rcafalchio
Estranho , está exatamente igual porém continuo recebendo o erro.
Você pode mostrar como estão suas tabelas do banco?
Que raiva, to quase desistindo e colocando um id na tabela empresa…
wagnerfrancisco
Tabela usuarios
codigo_usuario (PK)
Tabela empresas
codigo_usuario (PK)
FK codigo_usuario para usuarios.codigo_usuario
hibernate_sequence pra gerar os ids de codigo_usuario.
R
rcafalchio
Bom, tentei mudar o banco e nada, você pode copiar e colar o comando para gerar o banco a partir das Entity’s?
Fazendo assim não tem como eu errar.
Acredito que é a última vez que peço ajuda, desculpa ai…
Abraço!
wagnerfrancisco
Opa… segue a parte relevante do dump (tirei apenas esquema de permissões e coisas assim):