Pessoal,
Estou estudando pelo livro Enterprise JavaBeans 3.0 5th Edition de Bill Burke .
Lá diz que ao criar um relacionamento unidirecional um para muitos tem pelo menos 2 possibilidades:
- na tabela do lado “muitos” colocar uma FK para a tabela do lado 1.
- criar uma tabela de ligacao com 2 colunas, cada uma sendo FK de cada entidade, sendo que a coluna do lado do “muitos” deve ser AK (pois senao, a relacao seria NxM).
ex. usando linguagem natural pra representar tabelas:
1 Pessoa tem N Enderecos:
- Pessoa (id), Endereco (id, pessoa_id)
- Pessoa(id), Endereco(id), Pessoa_Has_Endereco(pessoa_id, endereco_id (unique))
A implementação do Hibernate usa a abordagem 1 e n tive problemas com a mesma… Só que precisei mudar o AS para GlassFish e, por padrao, ele usa TopLink… Resolvi usar o TopLink, já que vou implementar a aplicaçao independente de Provedor JPA.
Só que as classes anotadas que estavam funcionando ok com Hibernate, quando mudei para TopLink dava erro… TopLink usa a 2a. abordagem (uso de tabela intermediaria para ligacao). Porem, ele exige que tiremos a annotation @JoinColumn na entidade que mapea uma coluna com @OneToMany.
Classe Pessoa (tambem usando uma linguagem mais simples possivel):
class Pessoa {
@OneToMany
@JoinColumn(name=“pessoa_id”)
private Collection listaEndereco;
}
Com essa configuracao, o Hibernate gera as tabelas conforme previsto. Porém, usando TopLink, ele diz que não podemos colocar @JoinColumn para relacoes unidirecionais (onde pessoa tem atributo com os enderecos, mas endereco nao tem atributo pessoa). Tudo bem… como o projeto ta pequeno, retirei o @JoinColumn, e o TopLink criou, quase sem problemas, as tabelas conforma a abordagem 2… Porém, ele não colocou endereco_id como chave unica… com isso, a relacao que ele cria, na verdade, é NxM.
Alguém sabe se isso eh um bug conhecido do TopLink? Pesquisei um pouco em um forum da Oracle e o pessoal parece que acha isso comum (mapear relacionamento 1xN nas classes para tabelas NxM eh comum???)
O que acham?