Relacionamento com 3 tabelas

Oi pessoal,

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?

Obrigado.

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:

  @ManyToOne
	@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
	@JoinColumn(name="codVenda")
	private VendaJB venda;
		
	@ManyToOne
	@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
	@JoinColumn(name="codCompra")
	private CompraJB compra;

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.

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.

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

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.

Lembrando que…

[code]@ManyToOne
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
@JoinColumn(name=“id”)
private Profissional profissional;

@ManyToOne
@Cascade(value={org.hibernate.annotations.CascadeType.ALL})
@JoinColumn(name=“id”)
private Empresa empresa;
[/code]

… de ve ser colocado na entidade protocolo.

[quote=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.[/quote]

Você não pode usar dois campos? Um para cada tabela? Se sim, ai você usa o exemplo do Henrique

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…

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.

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.

uma alternativa que venho utilizando para este tipo de modelagem é criar tabelas intermediárias:

Profissionais ---- ProtocoloProfissionais - Protocolo - ProtocoloEmpresa - Empresas

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?

[quote=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. [/quote]

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…

Muito obrigado a todos, pela prontidão em ajudar.

Vou tentar como o wagne23 falou, cria uma classe pai e trabalhar com herança.

Cara tive exatamente o mesmo problema, e consegui resolver…

ve aih:

http://www.guj.com.br/posts/list/196658.java

Flw.