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

14/03/2019

0

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.
Antonio Junior

Antonio Junior

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

Assista grátis a nossa aula inaugural

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar