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);
}
}