카테고리 없음

JSON의 데이터 개체가 예상대로 표시되지 않음

기록만이살길 2021. 3. 2. 07:06
반응형

JSON의 데이터 개체가 예상대로 표시되지 않음

1. 질문(문제점):

데이터베이스에 두 개의 테이블이 있습니다. 하나는 주문이고 다른 하나는 제품입니다.

이것은 수업 순서입니다

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

2. 해결방안:

mapProductsToOrderById 메서드를 ProductService.class로 이동합니다. 그리고 역순으로 제품을 순서대로 추가하여했던 것과 동일합니다. 따라서 제품 세트에 주문을 추가합니다.

65749885
반응형