Невозможно сохранить сущность с сопоставлением OneToMany с использованием JPA - PullRequest
0 голосов
/ 14 апреля 2020

У меня 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
}

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

Я использую 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]

Куда я иду не так?

1 Ответ

1 голос
/ 14 апреля 2020

JPA не нашел Order внутри orderLineItems, поэтому order_id установлено как null. Чтобы сохранить дочерний элемент с родителем в двунаправленном отношении, установите родительский элемент в дочернем объекте также для синхронизации c обе стороны.

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