Pessoal,
Tenho uma parada que sempre tive dúvida se estou fazendo certo ou se há outra forma melhor de mapear.
Resolvi postar pra ver se alguem me ajuda.
Olhem o exemplo:
Meu sistema tem em todas as tabelas um campo idEmpresa.
Então, tenho um cadastro de clientes, que tem como chave composta os campos idEmpresa + idCliente.
Nesse cadastro de cliente, tenho o campo idUF, que é o código da UF do endereço do cliente.
Esse campo me remete a uma tabela de UFs (Unidades federativas), que tem como chave composta (idEmpresa + idUF).
Quando vou mapear o pojo do cliente, eu coloco uma relacao com a tabela de UFs, assim:
@JoinColumns({
@JoinColumn(name = "idEmpresa", referencedColumnName = "idEmpresa", insertable = false, updatable = false),
@JoinColumn(name = "idUF", referencedColumnName = "idUF", insertable = false, updatable = false)})
@ManyToOne(optional = false)
private Uf uf;
Ainda no pojo de clientes, tenho um campo marcado com @EmbeddedId, que refere-se a uma classe ClientePK.
Nessa classe, eu tenho dois campos: idEmpresa e idCliente.
Voltando a classe pojo do cliente,
Na minha visão, eu não precisaria ter um campo idUF nesse pojo, já que tenho uma referencia ao objeto da UF.
Só que, pra isso funcionar eu preciso tirar o “insertable = false, updatable = false” da anotação @JoinColumn do idUF.
Só que eu não posso tirar isso da anotação @JoinColumn do idEmpresa, pois esse campo já está mapeado dentro do meu @EmbeddedId.
Só que se eu não tirar, o hibernate dá erro também, pois diz que não permite mixar campos com insertable e updatable e campos sem isso, na mesma associação,
o seja, algo do tipo:
@JoinColumns({
@JoinColumn(name = "idEmpresa", referencedColumnName = "idEmpresa", insertable = false, updatable = false),
@JoinColumn(name = "idUF", referencedColumnName = "idUF")})
@ManyToOne(optional = false)
private Uf uf;
Pra resolver isso, no pojo do cliente, eu crio sempre a propriedade UF, que vai se referenciar ao objeto UF completo,
e uma propriedade idUF, que vai se referenciar ao codigo da uf diretamente.
Aí, no meu xhtml, eu faço referencia a propriedade UF do pojo.
Só que a minha propriedade idUF não é preenchida. Eu preciso fazer algo do tipo, na camada “service”:
entity.setIdUf(entity.getUF().getUFPK().getIdUF());
Vejam, atualmente eu faço assim, e me atende bem, mas me parece errado.
Deve ter alguma solução melhor…
Aguardo