Mapeamento Chaves Composta JPA+Hibernate

5 respostas
B

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?

5 Respostas

L

Você pode criar uma classe que represente estas chaves.
Exemplo de uso de EmbeddedId

B

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;

}

L

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

B

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

L

É 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?

Criado 4 de abril de 2017
Ultima resposta 4 de abr. de 2017
Respostas 5
Participantes 2