Mapeando map com valores entidade

Caso tivéssemos a seguinte regra:”Um Produto possui um Fornecedor por Estado”, um Map de Estado por Fornecedor seria a solução, segue a baixo como fazer o mapeamento para o Map :

@Entity
public class Produto {

  @Id
  private Long id;

  @ManyToMany(cascade = CascadeType.ALL)
  @MapKeyEnumerated(EnumType.STRING)
  @MapKeyColumn(name = "estado")
  @JoinTable(name = "produto_fornecedor", 
      joinColumns = @JoinColumn(name = "id_produto"), 
      inverseJoinColumns = @JoinColumn(name = "id_fornecedor"))
  private Map<Estado, Fornecedor> fornecedores;
  • @ManyToMany: Mapeamento muitos-para-muitos;
  • @MapKeyEnumerated(EnumType.STRING): Define que a chave do Map é uma Enum e será persistida como String;
  • @MapKeyColumn: Define que o nome do campo para a chave do Map;
  • @JoinTable: Como é um relacionamento ManyToMany é necessário uma nova tabela;
  • @JoinColumn(name = "id_produto"): A “amarração” de produto com a tabela produto_fornecedor;
  • @JoinColumn(name = "id_fornecedor"): A “amarração” de fornecedor,que é o valor do Map, com a tabela produto_fornecedor.

SQL do mapeamento

CREATE TABLE produto_fornecedor (
  id_produto bigint NOT NULL,
  id_fornecedor bigint NOT NULL,
  estado character varying(255) NOT NULL,
  CONSTRAINT produto_fornecedor_pk PRIMARY KEY (id_produto, estado),
  CONSTRAINT produto_fornecedor_for_fk FOREIGN KEY (id_fornecedor) REFERENCES fornecedor (id),
  CONSTRAINT produto_fornecedor_pro_fk FOREIGN KEY (id_produto) REFERENCES produto (id)
)
  • id : ID do produto;
  • produto_fornecedor_pk: A PK é formado pelo ID do produto + chave do Map;
  • produto_fornecedor_pro_fk: A referencia para o ID do fornecedor;
  • produto_fornecedor_for_fk: A referencia para o ID do produto.
Observação
A PK é composto pelo id e estado para garantir que a chave do Map é única para aquele produto.
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.