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.