无法使用JPA保存具有OneToMany映射的实体



我有OrderOrderLineItemOne-to-Many的关系。当我保存订单时,我会得到ConstraintViolationException。下面是代码片段。

@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
}

OrderLineItem类中

@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类

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

我使用的是OrderRepositoryOrderItemRepositoryJPA接口。

请求后

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

错误:

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]

我哪里错了?

JPA没有在orderLineItems中找到Order,这就是order_id设置为null的原因。若要在双向关系中将子实体与父实体一起保存,请将子实体中的父实体也设置为同步双方。

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

最新更新