Spring Boot整合MongoDB如何实现类似JPA @OneToMany的关联对象查询
Spring Boot + MongoDB 实现类@OneToMany关联映射的方案
简便实现方案
Spring Data MongoDB 已经提供了对应能力,直接使用@DBRef注解即可实现和Hibernate @OneToMany 几乎一致的自动关联映射效果,无需手动写关联查询逻辑。
以下是和你举例的Order、OrderDetails场景匹配的实现代码:
- 定义关联实体
// 订单明细实体,对应独立的order_details集合 @Document(collection = "order_details") public class OrderDetails { @Id private String id; private String productName; private Integer quantity; private BigDecimal unitPrice; // 省略get/set、构造方法 } // 订单实体,关联多个订单明细 @Document(collection = "orders") public class Order { @Id private String id; private String orderSn; private LocalDateTime createTime; // 加@DBRef注解即可实现自动关联查询 @DBRef private List<OrderDetails> detailsList; // 省略get/set、构造方法 }
- 定义Repository接口,直接继承MongoRepository即可
public interface OrderRepository extends MongoRepository<Order, String> { }
当你调用orderRepository.findById(id)查询订单时,框架会自动查询关联的所有OrderDetails数据,注入到detailsList字段中,和Hibernate的@OneToMany使用体验完全一致。
小提示:如果需要懒加载避免不必要的查询开销,可以修改注解为
@DBRef(lazy = true),只有当你调用getDetailsList()的时候才会触发关联查询。
其他可选实现方案
如果不想用@DBRef,还有两种常见实现:
- 嵌入式存储:直接把OrderDetails作为数组字段嵌入到Order文档中,不需要单独的集合,适合关联数据不需要独立查询、数据量小的场景,查询效率更高
- 手动关联:先查询Order对象,再手动用订单ID调用OrderDetails的Repository查询明细,自行组装到Order对象中,灵活但冗余代码多
关于是否属于ORM范畴的说明
严格来说这套实现不属于ORM:
ORM的全称是对象关系映射(Object Relational Mapping),是专门针对关系型数据库的表和Java对象做映射的工具,Hibernate就是典型的ORM框架。
而MongoDB是文档型数据库,Spring Data MongoDB的这套映射机制属于*ODM(对象文档映射,Object Document Mapping)*范畴,属于和ORM平行的、针对非关系型文档数据库的映射工具。不过广义上大家也会把ODM归类为ORM的泛化衍生类工具。
内容的提问来源于stack exchange,提问作者Jonny
相关产品推荐
相关产品推荐

