繁体   English   中英

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

[英]Unable to save Entity with OneToMany mapping using JPA

我有具有One-to-Many关系的OrderOrderLineItem 当我保存订单时,我收到 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 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);
    }
    ...
}

订单仓库

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

    List<Order> findAll();
}

我正在使用OrderRepositoryOrderItemRepository 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);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM