estou com um probleminha e gostaria da ajuda de vcs. Estou usando o hibernate e preciso relacionar 3 tabelas:
1-Profissionais
id_prof
nome
2-Empresas
id_emp
descricao
3-Protocolo
id_prot
id_fk
data
assunto
a tabela de Protocolo poderá receber tanto o id de Profissional quando o id de uma Empresa por vez, ou seja, só vai haver um protocolo por Profissional ou Empresa.
E minha dúvida é como fazer o mapeamento na entidade Protocolo; posso fazer um mapped by no campo id_fk para os campos id de Profissional e id de Protocolo? Como fazer?
Olá. Não sei se te ajuda, mas eu trabalhei em um projeto em que eu tinha as entidades venda, compra e item.
Esse item uma hora pertencia a uma venda e outra hora pertencia a uma compra. Então na entidade item mapeie assim:
Então quando um item pertencia a uma venda a entidade compra ficava com referencia nula e vice versa.
Pode não ser a melhor opção mas funciona.
F
fajo
Oi Henrique,
bom, pelo q entendi, na tua tabela de Vendas, vc tem dois campos, um VendaJB e outro CompraJB é isso? No meu caso é só um campo q deve se relacionar com 2 tabelas.
Jair_Rillo_Junior
fajo,
Usar um campo para fazer relacionamento com duas tabelas diferentes não me parece uma idéia legal (nem usual)
O melhor mesmo ,eu creio, seja criar dois campos: um para cada tabela.
Eu já trabalhei com um domínio similar e o exemplo do Henrique faz exatamente o que você precisa. Como ele mesmo disse: “Pode não ser a melhor opção mas funciona”.
Espero ter ajudado
H
henriquejhc
Não. Eu tenho uma tabela venda e uma tabela compra, porque elas tem colunas totalmente diferentes.
E minha tabela item pode ser de compra ou de venda.
É parecido com o seu caso. Você tem profissional e empresa. E tem protocolo. Acho que do jeito que você fez irá funcionar.
bom, pelo q entendi, na tua tabela de Vendas, vc tem dois campos, um VendaJB e outro CompraJB é isso? No meu caso é só um campo q deve se relacionar com 2 tabelas.
Você não pode usar dois campos? Um para cada tabela? Se sim, ai você usa o exemplo do Henrique
marcelo.bellissimo
Não dá pra fazer isso, pelo que eu sei… você tem que ter algo indicando de onde esse campo vem… aliás, você nem vai conseguir criar essa FK no banco, não dá pra referenciar um campo pra duas tabelas, e se você não fizer essa FK terá um sério problema de integridade de dados…
O que você tem que fazer é criar os dois campos, sem fazer constraint de FK (pois eles podem ser nulos) e utilizar essa lógica que falaram acima, se um dos campos está nulo, verifique o outro…
wagne23
Acho que vc poderia fazer da seguinte forma:
Criaria uma classe generica pra ser pai de Proficionais e Empresa e nela vc teria o id que seria herdado pelas filhas, ai vc faz o mapeamento de Protocolo com essa classe pai.
H
henriquejhc
Vou tentar explicar mais uma vez.
Tabela Profissionais
id_prof
nome
Tabela Empresas
id_emp
descricao
e na Tabela Protocolo
id_prot
id_fk_emp
id_fk_prof
data
assunto
Quando a tabela protocolo receber o id_fk_prof referenciando a tabela profissional o id_fk_emp que referencia a tabela empresa ficará nulo e vice e versa.
lvieira
uma alternativa que venho utilizando para este tipo de modelagem é criar tabelas intermediárias:
Assim se mais alguma entidade precisar de protocolos, vc não precisa alterar as tabelas existentes (deixando protocolo com vários campos fk nulos)
Mas mesmo sem mudar o banco, com a sua modelagem é só deixar os campos fk como opcionais não?
marcelo.bellissimo
henriquejhc:
Vou tentar explicar mais uma vez.
Tabela Profissionais
id_prof
nome
Tabela Empresas
id_emp
descricao
e na Tabela Protocolo
id_prot
id_fk_emp
id_fk_prof
data
assunto
Quando a tabela protocolo receber o id_fk_prof referenciando a tabela profissional o id_fk_emp que referencia a tabela empresa ficará nulo e vice e versa.
Então, antes você não tinha mostrado esses campos id_fk_emp e id_fk_prof … dessa maneira é simples, você simplesmente mapeia os dois referenciando a Empresa e o Profissional respectivamente, mas eles não podem ser PK… pois pra ser PK não pode ser nulo…
F
fajo
Muito obrigado a todos, pela prontidão em ajudar.
Vou tentar como o wagne23 falou, cria uma classe pai e trabalhar com herança.
S
samuelfac
Cara tive exatamente o mesmo problema, e consegui resolver…