Mapeando Lista de tipos básicos em entidades

Caso voce precise persistir em banco uma lista de String ou lista de Integer, como seria esse mapeamento ? como eu armazenaria isso em banco ? Logo a baixo vou mostrar um exemplo de um produto que possui uma lista de códigos, List codigos.

Ao adicionar o atributo List codigos na entidade Produto recebemos o erro de compilação: “basic attribute type should not be a container…check JPA spec”, porque o atributo é do tipo Basic então é necessário anotar o atributo com @ElementCollection para dizer que será persistido o atributo do tipo Basic e definir na anotação @CollectionTable como será persistido a lista de dados.

@Entity
public class Produto {

    @Id
    private Long id;

    @ElementCollection(fetch = FetchType.EAGER)
    @CollectionTable(name="produto_codigo", 
        joinColumns = @JoinColumn(name = "id"))
    @Column(name="codigo_produto")
    private List<String> codigos;

    ...
}
  • @ElementCollection: Define que a coleção será do tipo Basic
  • fetch = FetchType.EAGER: sempre que carregar a entidade produto será carregado a lista de códigos
  • @CollectionTable: Especifica a tabela que que será utilizado no mapeamento do tipo Basic
  • name=”produto_codigo”: nome da tabela que armazenará os códigos por produto
  • @JoinColumn(name = “id”): coluna do produto que será relacionada na tabela de códigos
  • @Column(name=”codigo_produto”): nome do campo código na tabela produto_codigo

Segue a baixo o SQL da tabela do mapeamento a cima:

create table produto_codigo( 
   id bigint not null,
   codigo_produto varchar(255) not null,
   CONSTRAINT produto_codigo_id_fk FOREIGN KEY (id) REFERENCES produto(id)
);

Como seria uma consulta para saber se um determinado código pertence ao produto? Segue a baixo a Named Query

    @NamedQueries({
        @NamedQuery(name = "Produto.findByCodigo",
            query = "from Produto p where :codigo in elements(p.codigos)")
    })

A única diferença é que o código vindo por parametro será feito um “IN” com elements(p.codigos), ou seja, os elementos da lista codigos.

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 )

w

Conectando a %s