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

问题描述 投票:0回答:2

我有

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);
    }
    ...
}

订单存储库

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

我哪里出错了?

java hibernate jpa spring-data-jpa
2个回答
2
投票

JPA 在

Order
中没有找到
orderLineItems
,这就是为什么
order_id
设置为
null
。要在双向关系中保存子实体与父实体,请在子实体中设置父实体也以同步双方。

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

0
投票

我也有同样的问题。添加就足够了 cascade = CascadeType.ALL 到 OneToMany 注释,

@OneToMany(级联= CascadeType.ALL)

通过父母的储蓄来拯救其孩子,无需任何其他考虑。

© www.soinside.com 2019 - 2024. All rights reserved.