the question to you dear experts is how I need to delete cart items when finalizing shopping. What I know is that I should not delete cart but only items in it. Therefore how to delete cart items when table cartItems is in many-to-one relation to cart. How do I need to set up hibernate tables so that when deleting cart items I do not delete cart of the customer and retain history of shopping.
@Entity
public class Cart {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private BigDecimal total_amount;
private Long session_id;
@OneToOne(cascade = CascadeType.ALL)
@JoinColumn(name = "user_id")
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
@Column(nullable = true)
@OneToMany(mappedBy="cart",cascade=CascadeType.ALL,fetch=FetchType.EAGER)
private List<CartItem> cartItems;
@OneToOne(cascade = CascadeType.ALL)
private Purchase purchase;
public BigDecimal getTotal_amount() {
return total_amount;
}
public void setTotal_amount(BigDecimal total_amount) {
this.total_amount = total_amount;
}
public Long getSession_id() {
return session_id;
}
public void setSession_id(Long session_id) {
this.session_id = session_id;
}
public List<CartItem> getCartItems() {
return cartItems;
}
public void setCartItems(List<CartItem> cartItems) {
this.cartItems = cartItems;
}
public Purchase getPurchase() {
return purchase;
}
public void setPurchase(Purchase purchase) {
this.purchase = purchase;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public void addProduct(Product product) {
CartItem item = this.findItemByID(product.getId());
if (item == null) {
item = new CartItem();
item.setQuantity(BigDecimal.valueOf(1));
item.setProduct(product);
this.cartItems.add(item);
}
}
private CartItem findItemByID(Long id) {
CartItem item = null;
for (int i = 0; i < cartItems.size(); i++) {
if (cartItems.get(i).getProduct().getId() == id) {
item = cartItems.get(i);
}
}
return item;
}
}
@Entity
public class CartItem {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@ManyToOne
@JoinColumn(name="cartId")
private Cart cart;
@ManyToOne
private Product product;
private BigDecimal total_price;
public BigDecimal getTotal_price() {
return total_price;
}
public void setTotal_price(BigDecimal total_price) {
this.total_price = total_price;
}
public Product getProduct() {
return product;
}
public void setProduct(Product product) {
this.product = product;
}
private BigDecimal price;
private BigDecimal quantity;
public Cart getCart() {
return cart;
}
public void setCart(Cart cart) {
this.cart = cart;
}
public BigDecimal getPrice() {
return price;
}
public void setPrice(BigDecimal price) {
this.price = price;
}
public BigDecimal getQuantity() {
return quantity;
}
public void setQuantity(BigDecimal quantity) {
this.quantity = quantity;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
}
@GetMapping("/finalization/{cartId}")
public String createOrder(@PathVariable("cartId")Long cartId, Model model,@ModelAttribute("payment")@Valid PaymentMethod paymentMethod, BindingResult bindingResult){
Purchase purchase = new Purchase();
Cart cart = cartRepository.getCartById(cartId);
List<CartItem> cartItemList = cart.getCartItems();
purchase.setCart(cart);
User user = cart.getUser();
purchase.setUser(user);
purchase.setPaymentMethod(paymentMethod);
purchaseRepository.save(purchase);
model.addAttribute("finalization", cartItemList);
cartItemRepository.deleteAllByCart(cart);
return "finalPage";
}