Solucionado (ver solução)
Solucionado
(ver solução)
4
respostas

Como mapear coluna comum para dois relacionamentos

Procurei por tópico parecido aqui e não encontrei. Tenho uma entidade Pedido mapeando uma tabela de Pedidos no banco de dados. O problema é que esta entidade tem um relacionamento @ManyToOne obrigatório com a entidade Cliente cujo id é o idCliente. A entidade Pedido também tem um relacionamento opcional com a entidade EnderecoCliente cujo id composto é o idCliente + idEndereço.

Na tabela original de pedidos, eu só tenho uma coluna idCliente para atender os dois relacionamentos. E funciona bem. O idCliente é sempre preenchido. O endereço é preenchido de vez em quando.

Consigo mapear isto na entidade numa boa, mas quando vou fazer uma leitura na entidade Pedido, eu pego erro na leitura da entidade EnderecoCliente do pedido. Alguém já passou por isto?

4 respostas

Opa, estou curioso para saber como você mapeou :). Até onde eu sei você precisa ter um atributo do tipo, por exemplo, cliente na sua classe Pedido para fazer o mapeamento... Como que isso funcionou para mapear o endereço também?

Mapeei desse modo e consegui pelo menos rodar. Falta ver na hora da persistência se vai funcionar. Estou batalhando em outro erro para poder chegar lá e testar. Hoje, devo ter uma resposta ainda. Se puder, dá uma olhada e me diz o que acha?

@ManyToOne @JoinColumn(name = "ID_CLIENTE", referencedColumnName = "ID_CLIENTE")

private Cliente cliente;

@ManyToOne @JoinColumns({ @JoinColumn(name = "ID_CLIENTE", referencedColumnName = "ID_CLIENTE", insertable = false, updatable = false), @JoinColumn(name = "NR_ENDERECO", referencedColumnName = "NR_ENDERECO") })

private EnderecoCliente enderecoCliente;

Engenhoso :). Eu acho que realmente dificulta a manutenção, mas entendo a necessidade... É até complicado de ler, sabe? Quando passar pelo outro erro, posta aqui o progresso.

solução!

Alberto,

funcionou. A única coisa diferente que tive que fazer foi na hora de setar o objeto Cliente na entidade Pedido.

Eu o fiz depois de setar a EnderecoCliente. Nem sempre o endereço era informado e o código colocava null na propriedade IdCliente que faz parte do id composto desta entidade.

Setando o Cliente depois do endereço, eu garanto que o IdCliente (campo mandatório na tabela) vai ser preenchido.

Obrigado pela atenção!