JSON 中的数据对象未按预期显示

Posted

技术标签:

【中文标题】JSON 中的数据对象未按预期显示【英文标题】:Data object in JSON not showing as expected 【发布时间】:2021-04-21 07:07:01 【问题描述】:

我在数据库中有两个表。一个是订单,另一个是产品。

这是一个类订单

@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 发送请求以将 Product 添加到 Order 中时:

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 指向某些 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);

【问题讨论】:

请创建一个minimal reproducible example。没有看到相关代码,我们无法全面分析问题。 添加产品实际上是否以正确的方式将其持久化到数据库中? 你尝试过 fetchtype eager 而不是 lazy 吗? @Turing85 我已经更新了帖子。如果您需要更多代码,请查看并告诉我。 @k-wasilewski 是的,您是对的,数据不会保留在数据库中。我认为问题出在我试图加入它们的订单和产品类中。我更新了帖子,请看一下。 【参考方案1】:

将方法 mapProductsToOrderById 移动到 ProductService.class。 并通过反向将产品添加到 order by 中做同样的事情。因此,您将订单添加到产品集中。

【讨论】:

谢谢。我通过那个问题是在 JoinColums

以上是关于JSON 中的数据对象未按预期显示的主要内容,如果未能解决你的问题,请参考以下文章

使用位置时页面布局未按预期显示:已修复页面内容

数据视图行过滤器未按预期工作

UITableViewCell 未按预期显示约束

UIStackView 未按预期显示

为啥模态演示表单未按预期显示?

PHP 中的 file_exists 未按预期工作