Estou com problemas com o relacionamento entre entidades em um projeto, onde todas as entidades possuem a chave primária composta por 3 campos;
Produto(**ck_del, cod_empresa, codigo**, descricao, cod_grupo, cod_imposto);
Grupo(**ck_del, cod_empresa, codigo**, descricao);
Imposto(**ck_del, cod_empresa, codigo**, descricao);
//Mapeamento na entidade PRODUTO
@ManyToOne
@JoinColumn(name="COD_GRUPO" , referencedColumnName="CODIGO")
private Grupo grupo;
@ManyToOne
@JoinColumn(name="COD_IMPOSTO" , referencedColumnName="CODIGO")
private Imposto imposto;
Quando tento mapear a entidade produto com as outras duas entidades apenas pelo campo Codigo de cada entidade retorna o erro:
referencedColumnNames(CODIGO) of models.Produto.grupo
referencing models.Grupo not mapped to a single property
Provavelmente porque a chave primária de Grupo é composta, existe alguma forma de fazer esse relacionamento sem ter que alterar as chaves primárias das entidades?
Você pode criar uma classe que represente estas chaves.
Exemplo de uso de EmbeddedId
Eu uso uma Classe PK para cada entidade para utilizar o find ou getReference;
@Entity
@Table(name = “PRODUTO”)
@IdClass(value = ProdutoPK.class)
public class Produto implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@Column(name = "CK_DEL")
private BigInteger ckDel;
@Id
private Integer cod_empresa;
@Id
@Column(name = "CODIGO")
private Integer codigo;
}
public class ProdutoPK implements Serializable {
private static final long serialVersionUID = 1L;
@Column(name = "CK_DEL")
private BigInteger ckDel;
private Integer cod_empresa;
@Column(name = "CODIGO")
private Integer codigo;
}
Há uma maneira de referenciar cada uma das join columns, de acordo com as colunas que compõem a PK de outra tabela.
Veja aqui a segunda resposta
Olhando os exemplos que passou, me parece que a minha modelagem é diferente pois eu tenho chaves primárias compostas mas a chave estrangeira é simples na classe produto tenho apenas a referencia COD_GRUPO, mas Grupo tem chave primária composta.
veja como fica a disposicao dos dados nas tabelas na imagem abaixo:
Imagem Dados
É por isso que eu acho um grande erro colocar chaves compostas. A ideia de chave primaria é garantir que nenhuma tupla tenha valores iguais ao das demais. Isso se consegue com uma PK auto incrementável e colocando unique nos campos que não se quer duplicar.
Você tentou deixar sem a anotação @JoinColumn e deixar a propriedade hibernate.hbm2ddl.auto como update e ver como o hibernate se vira com esse problema?