Objeto do Hibernate ManyToOne referenciando duas vezes na mesma tabela

9 respostas
R

Tenho um objeto do hibernate que precisa referenciar duas vezes a mesma tabela.

Explicando melhor, tenho um pedido que pode ter duas transportadoras.Seria a transportadora e outra para o redespacho.Tanto a transportadora como o redespacho pega um objeto da tabela de transportadora, mas o hibernate não me permite isso.O que eu posso fazer?

9 Respostas

B

O que você quer dizer com “o hibernate não me permite isso”? Mostre-nos como tirou essa conclusão.

R
@ManyToOne
 @JoinColumn(name="transportadora")
	private Transportadora transportadora;
	
@ManyToOne
@JoinColumn(name="transportadora")
	private Transportadora redespacho;

Tentei o seguinte, só que as duas colunas não podem referenciar a mesma tabela.

E dá esse erro, nem compila:

"Repeated column in mapping for entity"

Se eu coloco no JoinColumn, updatable= false , insertable= false

Ele compila, mas não salva

R

Alguem?

J

Pq vc não cria uma classe - tabela, para guardar a transportadora e redespacho de um produto. Assim, vc iria guardar o id_pedido, id_transportadora e um atributo is_redespacho, onde a transportadora que fosse o redespacho seria colocado flag de verdadeiro.

R

Alguma outra solução?

B

Não há outra solução, sua modelagem está incorreta. Pense pelo lado SQL, você está querendo criar quatro chaves estrangeiras (sendo duas iguais) em uma tabela só.

R

Alguma sugestão de uma modelagem correta?Ainda estou em tempo de arrumar isso.
Só me de uma direção que o resto corro atrás

R

Assim, agora que tive um tempo fui ler um pouco sobre relacionamentos do Hibernate.

Tem quatro relacionamentos:

*One-To-One
*One-To-Many
*Many-To-One
*Many-To-Many

No meu caso preciso:

Como preciso de mais de um objeto transportadora: Many
Como esse objeto transportadora pode pertencer a outros pedidos: Many

O correto seria usar Many-To-Many

Porém não vou precisar várias transportadoras, apenas duas…

A solução acho que vai ser salvar o redespacho como um numero inteiro mesmo referenciando ao codigo da transportadora (sem FK), ou então criar um objeto TransportadoraPedido e fazer conforme ja foi citado acima…

R

Nunca usei esse recurso, mas, até onde sei, é possível referenciar duas vezes a mesma tabela. A única "pegadinha" é que você terá de ser bastante explícito em relação às colunas referenciadas:

@ManyToOne  
@JoinColumn(name="nome_do_campo_de_chave_estrangeira_da_transportadora_nesta_tabela",
  referencedColumnName="nome_do_campo_de_chave_primaria_da_transportadora_na_tabela_de_transportadoras")
private Transportadora transportadora;  
      
@ManyToOne  
@JoinColumn(name="nome_do_campo_de_chave_estrangeira_da_redespachadora_nesta_tabela",
  referencedColumnName="nome_do_campo_de_chave_primaria_da_redespachadora_na_tabela_de_transportadoras")
private Transportadora redespacho;
Criado 22 de julho de 2009
Ultima resposta 6 de ago. de 2009
Respostas 9
Participantes 4