Northwind - создание заказов (MySQL + Spring boot) - PullRequest
0 голосов
/ 30 октября 2018

У меня есть БД со схемой, как показано ниже: enter image description here

Я бы хотел создать Заказ. Я создал DAO Порядка со всеми столбцами, как показано ниже, и добавил туда такие отношения:

Заказать

@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name ="OrderID", nullable = false,unique = true)
    private Integer orderID;

// here attributes from Columns I am skipping it

    @ManyToOne
    @JoinColumn(name = "customerID", insertable = false, updatable = false)
    @JsonIgnore
    private Customer customer;

    public Customer getCustomer() {
        return this.customer;
    }

    public void setCustomer(Customer customer) {
        this.customer = customer;
    }

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private Set<OrderDetails> orderDetails;
    public Set<OrderDetails> getOrderDetails() {
        return orderDetails;
    }

    public void setOrderDetails(Set<OrderDetails> orderDetails) {
        this.orderDetails = orderDetails;
    }

Мне интересно, как я могу создать POST с деталями заказа. Я попробовал это так:

Служба заказа

public void createOrUpdateOrder(Order order){
    Set<OrderDetails> orderDetailsSet = new HashSet<>();

    for( OrderDetails orderDetails : order.getOrderDetails() ) {
        orderDetails.setOrder( order );
        orderDetails.setOrderID(order.getOrderID()); // HERE IS NULL, orderID is not set yet, maybe thats the reason
    }
    order.setOrderDetails( orderDetailsSet );
    orderRepository.save(order);
}

но таким образом, когда я ПОЛУЧАЮ все ордера с OrderDetails, я вижу, что для каждого ордера значение orderDetails пусто.

Вот мой пример полезной нагрузки POST:

{
"customerID":"ANATR",
"employeeID": 3,
"orderDate": "1996-07-10",
"requiredDate": "1996-07-24",
"shippedDate": "1996-07-16",
"shipVia": 2,
"freight": 58.17,
"shipName": "Hanari Carnes",
"shipAddress": "Rua do Paço, 67",
"shipCity": "Rio de Janeiro",
"shipRegion": "RJ",
"shipPostalCode": "05454-876",
"shipCountry": "Brazil",
"orderDetails":[
    {
         "unitPrice": 9,
         "quantity": 10,
         "discount": 0,
         "productID":12
    }
    ]
}

и мой ответ на заказ GET:

    "orderID": 1000019,
    "customerID": "ANATR",
    "employeeID": 3,
    "orderDate": "1996-07-10",
    "requiredDate": "1996-07-24",
    "shippedDate": "1996-07-16",
    "shipVia": 2,
    "freight": 58.17,
    "shipName": "Hanari Carnes",
    "shipAddress": "Rua do Paço, 67",
    "shipCity": "Rio de Janeiro",
    "shipRegion": "RJ",
    "shipPostalCode": "05454-876",
    "shipCountry": "Brazil",
    "orderDetails": []  <----- should not be empty!

Не могли бы вы помочь мне с этим?

Ответы [ 2 ]

0 голосов
/ 01 ноября 2018

Добавьте @ManyToOne(cascade = CascadeType.PERSIST) в ваше поле Order в сущности OrderDetails, чтобы hibernate знал, как соединить эти две сущности при сохранении их обоих.

Метод createOrUpdateOrder будет выглядеть так:

public Integer createOrUpdateOrder(Order order){
    Order newOrder = orderRepository.save(order);
    return newOrder.getOrderID();
}
0 голосов
/ 31 октября 2018

Можете ли вы попробовать присоединиться к таблице с помощью отношения FetchMode JOIN .

@OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
@Fetch(FetchMode.JOIN)
private Set<OrderDetails> orderDetails;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...