Olá Jefferson, tudo bem com você?
Ótima pergunta, inclusive durante o curso de Spring aqui da Alura temos uma situação parecida :)
Para isso precisamos na Loja adicionar uma anotação chamada @ElementCollection
que irá criar essa tabela a parte do banco de dados com a relação entre Loja e o nosso elemento ( no caso o DescontoEstados), e para isso precisamos colocar uma anotação chamada @Embeddable
, ou seja, que ele será embutido / incorporado
Dessa forma teríamos algo como a entidade Loja:
@Entity
public class Loja {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String nome;
@ElementCollection
List<DescontoEstados> DescontoEstados;
public void setDescontoEstados(List<DescontoEstados> descontoEstados) {
DescontoEstados = descontoEstados;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getNome() {
return nome;
}
}
Os descontos Estados:
@Embeddable
public class DescontoEstados {
private Double desconto;
private String UF;
public void setDesconto(Double desconto) {
this.desconto = desconto;
}
public Double getDesconto() {
return desconto;
}
public void setUF(String uF) {
UF = uF;
}
public String getUF() {
return UF;
}
}
E fazendo um pequeno teste de persistência:
EntityManagerFactory emf = Persistence.createEntityManagerFactory("contas");
EntityManager em = emf.createEntityManager();
Loja loja = new Loja();
loja.setNome("Americanas");
DescontoEstados descontoSP = new DescontoEstados();
DescontoEstados descontoRJ = new DescontoEstados();
descontoSP.setUF("SP");
descontoSP.setDesconto(30.5);
descontoRJ.setUF("RJ");
descontoRJ.setDesconto(40.2);
loja.setDescontoEstados(Arrays.asList(descontoSP, descontoRJ));
em.getTransaction().begin();
em.persist(loja);
em.getTransaction().commit();
em.close();
Teremos algo parecido com isso no Banco de Dados:
E a tabela Loja_DescontoEstados terá os seguintes campos:
Abraços e Bons Estudos!