Click here to Skip to main content
15,889,909 members
Please Sign up or sign in to vote.
1.00/5 (1 vote)
See more:
"could not execute statement [Duplicate entry '1' for key 'orders.UK_i4xhef5x6drd02us28r33k430'] [insert into orders (billing_address_id,delivered_date,order_bill,order_status,ordered_date,payment_status,user_user_id,order_id) values (?,?,?,?,?,?,?,?)]; SQL [insert into orders (billing_address_id,delivered_date,order_bill,order_status,ordered_date,payment_status,user_user_id,order_id) values (?,?,?,?,?,?,?,?)]; constraint [orders.UK_i4xhef5x6drd02us28r33k430]"

What I have tried:

Java
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.UUID)
    private String orderId;
    // PENDING , DISPATCHED
    private String orderStatus;
    // NOT-PAID , PAID
    private boolean paymentStatus;
    private double orderBill;
    private LocalDate orderedDate;
    private LocalDate deliveredDate;
    @ManyToOne(cascade = CascadeType.PERSIST , fetch = FetchType.EAGER)
    private User user;
    @OneToMany(cascade = CascadeType.ALL , fetch = FetchType.LAZY)
    private Set<orderitem> orderItems = new LinkedHashSet<>();
    @OneToOne(cascade = CascadeType.PERSIST)
    private BillingAddress billingAddress;

}


@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
public class OrderItem {
    @Id()
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private int count = 1;
    private double itemBill;
    @OneToOne
    private Product product;
    @ManyToOne()
    private Order order;
    
}

//This is the Service method that produces the exception on the line where I try to save Order to the database:

 public OrderDto proceedToCheckout(String userId) {
        User user  = userService.checkUserExists(userId);
        List<order> orders =  user.getOrderHistory();
        for(Order order : orders)
        {
            if(!order.isPaymentStatus())
            {
                throw new BadRequestApiException("You already have 1 order pending. Please clear that order first" +
                        " before creating a new order");
            }
        }
        Cart userCart = user.getMyCart();
        if(userCart == null)
        {
            throw new BadRequestApiException("Your cart is empty.");
        }
        Set<cartitem> cartItems = userCart.getCartItemSet();
        Order order = new Order();
        order.setUser(user);
        order.setOrderedDate(LocalDate.now());
        order.setOrderStatus("pending");
        order.setPaymentStatus(false);
        order.setOrderBill(userCart.getTotalBill());
        if(user.getBillingAddress() == null)
        {
            throw new ResourceNotFoundException("Please fill the Billing address first" +
                    " before creating your order");
        }
        order.setBillingAddress(user.getBillingAddress());
        Set<orderitem> orderItems= order.getOrderItems();
        Iterator<cartitem> it = cartItems.iterator();
        while(it.hasNext())
        {
            CartItem cartItem = it.next();

            OrderItem orderItem = new OrderItem();
            orderItem.setOrder(order);
            orderItem.setItemBill(cartItem.getItemBill());
            orderItem.setCount(cartItem.getCount());
            orderItem.setProduct(cartItem.getProduct());
            orderItems.add(orderItem);
            logger.info("orderItem in this order : {}" , orderItem.getId());
        }
        orders.add(order);
        logger.info("New Order Id = {}" , order.getOrderId());
        Order savedOrder = orderRepository.save(order);

        return modelMapper.map(savedOrder , OrderDto.class );
    }
Posted
Updated 28-Nov-23 22:45pm
v2

1 solution

The first thing to check is to make sure that your 'Order' entity is properly mapped in your database, and there are no existing entries with duplicate ID's that might clash with each other.

The issue might also be because your 'order_id' is not being generated correctly or is not unique resulting in the duplicate error. In your 'Order' entity, you have specified '@GeneratedValue(strategy = GenerationType.UUID)' for your 'orderId' field, but it looks like it might not be working as expected.

To create proper unique 'UUIDs' for your 'order_id' you can update the '@GeneratedValue' annotation for 'orderId' using -
Java
@Id
@GeneratedValue(generator = "uuid2")
@GenericGenerator(name = "uuid2", strategy = "uuid2")
private String orderId;
 
Share this answer
 

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900