我有Order
和OrderLineItem
与One-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();
}
我使用的是OrderRepository
和OrderItemRepository
JPA接口。
请求后
{
"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);
}