Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Duvida sobre relacionamento

Olá , sobre essas opções de relacionamento estou com a seguinte duvida em qual usar no seguinte cenário:

Como estou bastante acostumado com jdbc vou explicar como faço que talvez fique melhor ..

Suponha 2 entidades Loja e DescontoEstados

Sendo os objetos da seguinte forma: Ex.

Loja {
Long id; 
List<DescontoEstados> descontoEstados;
....
}
DescontoEstados{
    Long loja_id;  // <<<<<Eu costumo relacionar o desconto com a loja por aqui
    UF uf;
    Double desconto;
...
}

Desta forma eu tenho no banco uma tabela Loja e uma tabela com os loja_descontos_estados onde as colunas são loja_id, uf, desconto

Como devo fazer em JPA esse relacionamento? Pois ter uma tabela de ligação e uma tabela somente com os descontos com UF com ids próprios não me faz muito sentido já que essa tabela não serve para nada mais do que armazenar os descontos da loja.

1 resposta
solução!

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:

  • Loja
  • Loja_DescontoEstados

E a tabela Loja_DescontoEstados terá os seguintes campos:

  • Loja_Id
  • UF
  • Desconto

Abraços e Bons Estudos!