Intermediate table mapping with JPA attributes

Asked

Viewed 63 times

0

Hello, I’m trying to create a relationship where there is an intermediary table that has fields other than foreign keys. My classes are like this:

@Entity
public class Pedido {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idpedido")
    private Long idPedido;

    private Long numero;

    @Column(name = "datapedido")
    private OffsetDateTime dataPedido;

    @ManyToOne
    @JoinColumn(name = "idcliente")
    private Cliente cliente;

    @OneToMany(cascade = CascadeType.ALL)
    @JoinTable(name = "PedidoProduto", joinColumns = @JoinColumn(name = "idpedido"), inverseJoinColumns = @JoinColumn(name = "idproduto"))
    private List<PedidoProduto> produtos = new ArrayList<>();
    //getter e setter omitidos
}

@Entity
public class Produto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idproduto")
    private Long idProduto;
    private String codigo;
    private String descricao;
    private Double preco;
    //getter e setter omitidos
}

@Entity
@Table(name = "pedidoproduto")
public class PedidoProduto {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "idpedidoproduto")
    private Long idPedidoProduto;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "idpedido")
    private Pedido pedido;

    @ManyToOne
    @JoinColumn(name = "idproduto")
    private Produto produto;

    private Long quantidade;
    //getter e setter omitidos
}

My controller:

@RestController
@RequestMapping("/pedidos")
public class PedidoController {

    @Autowired
    private PedidoRepository pedidoRepository;

    @Autowired
    private ProdutoRepository produtoRepository;

    @Autowired
    private ClienteRepository clienteRepository;
    
    @Autowired
    private PedidoProdutoRepository pedidoProdutoRepository;

    @GetMapping
    public List<Pedido> listar() {
        return pedidoRepository.findAll();
    }

    @PostMapping
    public Pedido adicionarPedido(@RequestBody Pedido pedido) {
        List<PedidoProduto> temp = new ArrayList<>();
        Cliente cliente = clienteRepository.save(pedido.getCliente());
        
        for(PedidoProduto pedidoproduto: pedido.getProdutos()) {
            Produto produto = produtoRepository.save(pedidoproduto.getProduto());
            pedidoproduto.setProduto(produto);
            temp.add(pedidoproduto);
        }
        
        pedido.setCliente(cliente);
        pedido.setProdutos(temp);
        
        return pedidoRepository.save(pedido);
    }

}

If I enter directly into the bank with you list the order information with customer and the products with their quantities, but when I enter I get the error saying that I can not insert null idpedido in pedidoproduto. JSON I’m trying to save via Postman.

   {
        "numero": 100,
        "dataPedido": "2021-03-22T21:00:00-03:00",
        "cliente": {
            "razaoSocial": "comercio de bebidas jacarezinho ltda",
            "cnpj": "0000012345678",
            "telefone": "123456789",
            "email": "[email protected]"
        },
        "produtos": [
            {
                "produto": {
                    "codigo": "PPTS7",
                    "descricao": "pano de prato semaninha 7x15",
                    "preco": 12.5
                },
                "quantidade": 10
            }
        ]
    }

How do I have an intermediate table that contains other fields, and enables all crud operations?

1 answer

0

At no time in your code do you tell your Pedidoproduct which order it is from. By mapping, just adding pedidoproduto.setPedido(pedido); would not solve ?

Browser other questions tagged

You are not signed in. Login or sign up in order to post.