2
respostas

[Dúvida] Fazer um Post Com Entidade de chave composta

Gostaria que me ajudassem, estou terminando uma API de compras, mas estou com dificuldade em trazer realizar essa transação. No caso eu tenho que fazer o método Post para inserir um Produto no Pedido, fazendo a junção da entidade PedidoItem

Classe PedidoItem - que possui a chave composta PedidoItemPk


@Entity
@Table(name =" tb_pedido_item")
public class PedidoItem implements Serializable {

    private static final long serialVersionUID = 1L;

    @EmbeddedId
    private PedidoItemPk id = new PedidoItemPk ();

    private Integer quantidade;
    private Double preco;

    public PedidoItem() {

    }

    public PedidoItem(Pedido pedido, Produto produto, Integer quantidade) {
        super();
        id.setPedido(pedido);
        id.setProduto(produto);
        this.quantidade = quantidade;
        this.preco = produto.getPreco();
    }

    public PedidoItem(PedidoItemPk id, Integer quantidade, Double preco) {
        super();
        this.id=id;
        this.quantidade = quantidade;
        this.preco = preco;
    }

    @JsonIgnore
    public Pedido getPedido() {
        return id.getPedido();
    }
    public void setPedido() {
        id.setPedido(getPedido());
    }


    public Produto getProduto() {
        return id.getProduto();
    }
    public void setProduto() {
        id.setProduto(getProduto());
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    public Double getPreco() {
        return preco;
    }

    public void setPreco(Double preco) {
        this.preco = preco;
    }

    public Double getSubTotal() {
        return preco * quantidade;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PedidoItem other = (PedidoItem) obj;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        return true;
    }

}

Classe PedidoItemPK

ublic class PedidoItemPk implements Serializable {

    private static final long serialVersionUID = 1L;

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

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


    public Pedido getPedido() {
        return pedido;
    }
    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }
    public Produto getProduto() {
        return produto;
    }
    public void setProduto(Produto produto) {
        this.produto = produto;
    }

    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + ((pedido == null) ? 0 : pedido.hashCode());
        result = prime * result + ((produto == null) ? 0 : produto.hashCode());
        return result;
    }
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        PedidoItemPk other = (PedidoItemPk) obj;
        if (pedido == null) {
            if (other.pedido != null)
                return false;
        } else if (!pedido.equals(other.pedido))
            return false;
        if (produto == null) {
            if (other.produto != null)
                return false;
        } else if (!produto.equals(other.produto))
            return false;
        return true;
    }
}
@Service
public class PedidoItemService {
    @Autowired
    private PedidoItemRepository rep;

    @Autowired
    private PedidoRepository pedidoRepository;



    public List<PedidoItem> findAll() {
        return rep.findAll();
    }

    public List<PedidoItem> findById(Long id) {
        // faço a procura do pedidoItem com base em uma das chaves primarias compostas
        // do PedidoItemPk - no caso a chave Pedido
        Pedido pedido = pedidoRepository.getById(id);

        return rep.findByIdPedido(pedido);
    }

    public PedidoItem inserir(PedidoItem form) {

        return rep.save(form);
    }

}

PedidoItem Resource


@RestController
@RequestMapping(value = "/carrinho")
public class PedidoItemResource {

    @Autowired
    PedidoItemService pis;

    @GetMapping
    @Transactional
    public ResponseEntity<List<PedidoItem>> findAll(){
        List<PedidoItem> l = pis.findAll();
        return ResponseEntity.ok().body(l);
    }

    @GetMapping (value="/{id}")
    @Transactional
    public ResponseEntity<List<PedidoItem>> findById(@PathVariable Long id){
        List<PedidoItem> l = pis.findById(id);
        return ResponseEntity.ok().body(l);
    }

    @PostMapping 
    @Transactional
    public ResponseEntity<PedidoItem> adicionar(@RequestBody PedidoItem item, UriComponentsBuilder uriBuilder) {

        PedidoItem pi = pis.inserir(item);

        URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}").buildAndExpand(item.getPedido()).toUri();

        return ResponseEntity.created(uri).body(pi);
    }    
}
2 respostas

Além disso, existe uma classe de teste com dados mockados para melhor vizualização

@Configuration
@Profile("test")
public class TestConfig implements CommandLineRunner {

    @Autowired
    private UsuarioRepository uR;
    @Autowired
    private PedidoRepository  pR;
    @Autowired
    private CategoriaRepository cR;
    @Autowired
    ProdutoRepository prodR;
    @Autowired
    private PedidoItemRepository piR;

    @Override
    public void run(String... args) throws Exception {

        Usuario u1 = new Usuario(null, "Maria Brown", "maria@gmail.com", "988888888", "123456");
        Usuario u2 = new Usuario(null, "Alex Green", "alex@gmail.com", "977777777", "123456");
        uR.saveAll(Arrays.asList(u1,u2));

        Pedido p1 = new Pedido(null, Instant.parse("2019-06-20T19:53:07Z"),PedidoStatus.PAGO, u1); //nos atributos pedidos há o cliente no qual é colocado no construtror para fazer a associacao 
        Pedido p2 = new Pedido(null, Instant.parse("2019-07-21T03:42:10Z"),PedidoStatus.ESPERANDO_PAGAMENTO, u2);
        Pedido p3 = new Pedido(null, Instant.parse("2019-07-22T15:21:22Z"), PedidoStatus.ESPERANDO_PAGAMENTO,u1);
        pR.saveAll(Arrays.asList(p1,p2,p3));

        Categoria cat1 = new Categoria(null, "Electronics");
        Categoria cat2 = new Categoria(null, "Books");
        Categoria cat3 = new Categoria(null, "Computers");
        cR.saveAll(Arrays.asList(cat1, cat2, cat3));

        Set<Categoria> books = cR.findById(2L).stream().collect(Collectors.toSet());
        Set<Categoria> pcs = new HashSet<>(cR.findAllById(Arrays.asList(1L, 3L)));

        Produto pr1 = new Produto(null, "The Lord of the Rings", "Lorem ipsum dolor sit amet, consectetur.", 90.5, "", books);
        Produto pr2 = new Produto(null, "Smart TV", "Nulla eu imperdiet purus. Maecenas ante.", 2190.0, "", cR.findById(1L).stream().collect(Collectors.toSet()));
        Produto pr3 = new Produto(null, "Macbook Pro", "Nam eleifend maximus tortor, at mollis.", 1250.0, "", pcs);
        Produto pr4 = new Produto(null, "PC Gamer", "Donec aliquet odio ac rhoncus cursus.", 1200.0, "", pcs);
        Produto pr5 = new Produto(null, "Rails for Dummies", "Cras fringilla convallis sem vel faucibus.", 100.99, "", books);
        prodR.saveAll(Arrays.asList(pr1, pr2, pr3, pr4,pr5));

        PedidoItem oi1 = new PedidoItem(p1, pr1, 2);
        PedidoItem oi2 = new PedidoItem(p1, pr3, 1);
        PedidoItem oi3 = new PedidoItem(p2, pr3, 2);
        PedidoItem oi4 = new PedidoItem(p3, pr5, 2);

        piR.saveAll(Arrays.asList(oi1,oi2,oi3,oi4));

        Pagamento pag1 = new Pagamento (null,Instant.parse("2019-06-20T21:53:07Z"),p1);
        p1.setPagamento(pag1);
        pR.save(p1);
    }

qual exception vc tá tomando?