Spring Boot多对多关联GET请求返回空数组 如何用JPA实现数据查询
问题原因和修复方案
1. 关联关系映射配置错误
你在Order类中对productOrderDetails字段配置的@OneToMany注解的mappedBy属性填错了:
// 原错误配置 @OneToMany(mappedBy = "product",fetch = FetchType.LAZY,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true) private Set<ProductOrderDetails> productOrderDetails;
mappedBy的值应该是中间表ProductOrderDetails中关联Order的属性名,也就是order,而不是product(product是关联商品的属性名)。
2. 懒加载未触发导致空值
你配置的fetch = FetchType.LAZY是懒加载策略,当接口返回Order对象进行JSON序列化时,数据库会话已经关闭,不会主动触发懒加载查询关联的productOrderDetails数据,所以返回空数组。
解决方案有两种可选:
- 方案1:把FetchType改成EAGER,查询Order的时候自动关联查询中间表数据:
@OneToMany(mappedBy = "order",fetch = FetchType.EAGER,cascade = {CascadeType.PERSIST,CascadeType.MERGE,CascadeType.DETACH},orphanRemoval = true) private Set<ProductOrderDetails> productOrderDetails;
- 方案2:在Repository查询方法上添加
@EntityGraph注解,指定关联加载字段,不修改全局加载策略:
// 在你的OrderRepository中添加查询方法 @EntityGraph(attributePaths = "productOrderDetails") Optional<Order> findById(Long id);
3. 避免序列化循环引用
修复完上述两个问题后,会遇到JSON循环引用问题:Order包含ProductOrderDetails,ProductOrderDetails又包含Order,序列化会直接报错。需要在关联属性上添加忽略序列化注解:
在ProductOrderDetails类的order属性上添加@JsonIgnore注解:
@Id @ManyToOne(cascade = CascadeType.ALL) @JoinColumn(name="order_id") @JsonIgnore Order order;
如果使用Jackson序列化,也可以用@JsonManagedReference和@JsonBackReference配对处理循环引用。
额外修正
你Product类中的productOrderDetailsSet的mappedBy也配置错误,应该改为mappedBy = "product",如果后续需要查询商品对应的订单明细需要同步修正。
内容的提问来源于stack exchange,提问作者brvim
相关产品推荐
相关产品推荐

