데이터베이스에 두 개의 테이블이 있습니다. 하나는 주문이고 다른 하나는 제품입니다.
이것은 수업 순서입니다
@ManyToMany(cascade = CascadeType.ALL, mappedBy = "orders", fetch = FetchType.LAZY)
private Set<Product> products;
이것은 클래스 제품입니다
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY)
@JoinTable(name = "orders_products",
joinColumns = { @JoinColumn(name = "product_id", nullable = false, updatable = false)},
inverseJoinColumns = { @JoinColumn(name = "order_id", nullable = false, updatable = false)})
private Set<Order> orders;
나는 추가 REST API에 요청을 보낼 때 제품을 로 주문하기 :
localhost : 8080 / order / 1 / add / products? ids = 1
예상대로 결과를 얻습니다.
[
{
"id": 1,
"description": "Order number one description",
"name": "Shopping cart for mobiles",
"surcharge": 20.0,
"products": [
{
"id": 1,
"description": "Samsung S9",
"price": 599.99
}
]
}
]
결국 모든 주문을 받기 위해 GET 요청을 보낼 때 :
localhost : 8080 / 주문
이 결과를 얻을 것입니다.
[
{
"id": 1,
"description": "Order number one description",
"name": "Shopping cart for mobiles",
"surcharge": 20.0,
"products": []
}
]
실제 제품을보기 위해 "제품"을 열어야합니다. "제품"이 비어 있거나 "제품"의 본문이 표시되지 않는 이유는 무엇입니까?
감사합니다.
최신 정보:
이는 orders_products 테이블 아래의 데이터베이스에서 지속되지 않습니다 . @JoinTable (name = ...)의 Product 클래스를 확인하십시오 .
다음을 수행하면 :
제품에서 *를 선택하십시오;
# product_id description price
1 Samsung S9 599.99
2 Notebook S9 1000.99
3 Headset 1000.99
4 Mone 45.99
주문에서 *를 선택하십시오.
# order_id description name surcharge user_id
1 Order number one description Shopping cart for mobiles 20 2
2 Order for notebooks test second 20 2
하지만 내가하면. order_id poiting에서 일부 product_id까지의 ID가 있어야합니다. @ k-wasilewski는 데이터가 데이터베이스에 지속되지 않았기 때문입니다.
orders_products에서 *를 선택하십시오.
# product_id, order_id
null null
@ Turing85의 요구에 따라 OrderService 클래스에서 일부 코드를 추가하고 있습니다.
public List<Order> mapProductsToOrderById(final Long id, List<Long> ids) {
Order order = orderRepository.findById(id).orElseThrow(
() -> new OrderNotFoundException("Order with id: " + id + " was not found."));
List<Product> products = productRepository.findAll();
Set<Product> resultSet = order.getProducts();
ids.forEach(x -> products.forEach(product -> {
if(product.getId().compareTo(x) == 0){
resultSet.add(productRepository.findById(x).orElseThrow(
() -> new ProductNotFoundException("Product with id: " + x + " was not found.")
));
order.setProducts(resultSet);
orderRepository.save(order);
}
}));
return orderRepository.findAll();
}
Controller 클래스의 메서드가 있습니다.
@GetMapping("{id}/add/products")
public List<Order> mapProductsToOrder(@PathVariable Long id, @RequestParam("ids") List<Long> ids) {
return orderService.mapProductsToOrderById(id, ids);
}