Qual a maneira correta de receber e persistir dados em tabelas com relacionamento Many to Many?

14/03/2019

12

Olá, usando Hibernate e Jersey, qual a forma correta de persistir dados quando o relacionamento for Muitos para Muitos e na tabela extra que faz relacionamento ter atributos a mais?

Por exemplo:
Pedido, Produto e PedidoProduto. Na tabela PedidoProduto terá que ter outros atributos como "Quantidade, Preço".
Fico no aguardo.
Desde já agradeço.
Responder

Posts

14/06/2019

Paulo Carvalho

Olá, usando Hibernate e Jersey, qual a forma correta de persistir dados quando o relacionamento for Muitos para Muitos e na tabela extra que faz relacionamento ter atributos a mais?

Por exemplo:
Pedido, Produto e PedidoProduto. Na tabela PedidoProduto terá que ter outros atributos como "Quantidade, Preço".
Fico no aguardo.
Desde já agradeço.


Fala aí Antonio, tudo certo?

Então, neste caso de relacionamento ManyToMany eu costumo trabalhar com duas Collections, uma em cada classe do relacionamento, com a anotação @ManyToMany. Utilizando o Hibernate e a JPA com essa anotação nas duas classes, o próprio Hibernate se encarrega da criação da jointable, no seu caso a PedidoProduto. Não é necessário tem outros campos nessa terceira tabela porque a função dela é simplesmente armazenar a qual pedido determinado produto está atrelado, apenas isso. As informações de quantidade serão acessadas através da classe Pedido e as de preço na classe Produto.
Responder

14/06/2019

Antonio Junior

Olá, usando Hibernate e Jersey, qual a forma correta de persistir dados quando o relacionamento for Muitos para Muitos e na tabela extra que faz relacionamento ter atributos a mais?

Por exemplo:
Pedido, Produto e PedidoProduto. Na tabela PedidoProduto terá que ter outros atributos como "Quantidade, Preço".
Fico no aguardo.
Desde já agradeço.


Fala aí Antonio, tudo certo?

Então, neste caso de relacionamento ManyToMany eu costumo trabalhar com duas Collections, uma em cada classe do relacionamento, com a anotação @ManyToMany. Utilizando o Hibernate e a JPA com essa anotação nas duas classes, o próprio Hibernate se encarrega da criação da jointable, no seu caso a PedidoProduto. Não é necessário tem outros campos nessa terceira tabela porque a função dela é simplesmente armazenar a qual pedido determinado produto está atrelado, apenas isso. As informações de quantidade serão acessadas através da classe Pedido e as de preço na classe Produto.


Fala Paulo. Tudo certo e ai? Então Paulo na realidade o que acontece é o que eu citei acima. Por exemplo tenho a tabela produtos com os seus preços e tenho a tabela pedido que pode ter muitos produtos , se seguirmos a sua logica aconteceria o problema de que se eu mudar o valor produto, os pedidos que tiver os mesmo produtos terão alteração tbm, imagina que quando o pedido foi feito o produto x tem valor de R$10,00 ai depois de alguns dias teve um reajuste e no cadastro do produto foi atualizado para R$9,00 isso iria acarretar em discordâncias de dados, pois o pedidos que já foi lançado iria atualizar os valores. Então no meu ponto de vista tem que persistir o valor atual do produto e já tenho a solução para isso que é o seguinte:
//Na classe pedido 
@JsonIgnore
    @OneToMany(
            mappedBy = "pedido",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private List<PedidoProduto> pedidoProdutos = new ArrayList<>();

//Classe Produto
@OneToMany(
            mappedBy = "produto",
            cascade = CascadeType.ALL,
            orphanRemoval = true
    )
    private List<PedidoProduto> pedidoProdutos = new ArrayList<>();

//classe extra PedidoProduto
@Id
    @ManyToOne
    private Pedido pedido;

    @Id
    @ManyToOne
    private Produto produto;

    @Column(name = "quantidade")
    private float qtde;
    
    private float preco;

Responder
×
+1 DevUP
Acesso diário, +1 DevUP
Parabéns, você está investindo na sua carreira