Como mapear um Map em JPA ? Segue a baixo um exemplo da entidade Produto que tem uma descrição por língua. Para resolver esse problema mapearemos o atributo descrições como: Map<Locale, String> :
@Entity public class Produto { @Id private Long id; @ElementCollection(fetch = FetchType.EAGER) @MapKeyColumn(name = "locale") @Column(name = "descricao") @CollectionTable(name = "produto_descricao", joinColumns = @JoinColumn(name = "id")) private Map<Locale, String> descricoes;
- @ElementCollection: Define o mapeamento para atributos do tipo “Basic”;
- fetch = FetchType.EAGER: Faz com que o Map sempre seja carregado quando carregar o objeto produto;
- @MapKeyColumn(name = “locale”): Define o nome da chave do Map;
- @Column: Define o nome do valor do Map
- @CollectionTable: Define a tabela que será inserido os valores do Map;
- name = “produto_descricao”; : Nome da tabela;
- joinColumns = @JoinColumn(name = “id” : A “amarração” de produto com a tabela produto_descricao.
SQL do mapeamento
CREATE TABLE produto_descricao ( id bigint NOT NULL, descricao character varying(255), locale character varying(255) NOT NULL, CONSTRAINT produto_descricao_pk PRIMARY KEY (id, locale), CONSTRAINT produto_descricao_fk FOREIGN KEY (id) REFERENCES produto (id) )
- id : ID do produto;
- produto_descricao_pk: A PK é formado pelo ID do produto + chave do Map
- produto_descricao_fk: A referencia para o ID do produto
Observação
A PK é composto pelo id e locale para garantir que a chave do Map é unica para aquele produto.
A PK é composto pelo id e locale para garantir que a chave do Map é unica para aquele produto.