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 中的数据对象未按预期显示的主要内容,如果未能解决你的问题,请参考以下文章