Search code examples
javahibernatejpaspring-data-jpa

Unable to save Entity with OneToMany mapping using JPA


I have Order and OrderLineItem with One-to-Many relationship. When I am saving the Order, I am getting ConstraintViolationException. Below is the code snippet.

@Entity
@Table(name = "orders")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Order extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "order_id")
    @JsonProperty("order_id")
    private long orderId;

    private double price;

    @OneToMany(mappedBy = "order",
            fetch = EAGER,
            cascade = CascadeType.ALL )
    private Set<OrderLineItem> orderLineItems = new HashSet<>();


    // scaffolding code
    public void addOrderLineItem(OrderLineItem orderLineItem){
        this.orderLineItems.add(orderLineItem);
        orderLineItem.setOrder(this);
    }
    ... setters, getters, toString, equals and hashcode methods
}

In OrderLineItem class

@Entity
@Table(name = "order_line_item")
@JsonIgnoreProperties(ignoreUnknown = true)
public class OrderLineItem extends AuditModel {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private long id;
    private String name;
    private double price;

    @ManyToOne()
    @JoinColumn(name = "order_id", nullable = false)
    @JsonIgnore
    private Order order;

    public OrderLineItem(String name, double price){
        this.name = name;
        this.price = price;
    }

    public OrderLineItem(){}
    ... setters, getters, toString, equals and hashcode methods
}

OrderServiceImple class

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    private OrderRepository orderRepository;

    @Override
    public Order createOrder(Order order) {
        System.out.println("Inside the save method of Order service .... :: ");
        System.out.println(order);

        return this.orderRepository.save(order);
    }
    ...
}

OrderRepository

@Repository
public interface OrderRepository extends JpaRepository<Order, Long> {

    List<Order> findAll();
}

I am using OrderRepository and OrderItemRepository JPA interfaces.

The post request

{
  "price": 4500,
  "orderLineItems": [
     {
       "name": "new Order Item",
       "price": 4000
     }
   ]
}

Error:

java.sql.SQLIntegrityConstraintViolationException: Column 'order_id' cannot be null
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:117) ~[mysql-connector-java-8.0.19.jar:8.0.19]

Where am I going wrong?


Solution

  • JPA didn't find Order inside orderLineItems thats why order_id set as null. To save child with parent in the bidirectional relationship set parent in child entity also to sync both side.

    public Order createOrder(Order order) {
           for(OrderLineItem orderLineItem : order.getOrderLineItems()) {
               orderLineItem.setOrder(order);
           }
           return this.orderRepository.save(order);
    }