news 2026/4/18 2:28:13

EntityGraph的概念

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
EntityGraph的概念

EntityGraph的概念

在 Java 后端开发(尤其是使用 JPA,Java Persistence API 时),EntityGraph是 JPA 2.1 引入的一个特性。它本质上是一种查询优化机制,用于控制实体及其关联属性的加载策略,也就是可以指定在从数据库中检索实体时,哪些关联实体需要一起被加载,哪些可以后续按需加载。

EntityGraph的作用

  1. 按需加载关联实体
    • 在默认情况下,JPA 对于关联实体有不同的加载策略,比如LAZY(懒加载)和EAGER(急加载)。EntityGraph可以让开发人员根据实际的查询需求动态地指定加载策略,而不是在实体类定义时就固定下来。这样可以更灵活地控制数据库查询的性能。
    • 例如,在某些查询中可能只需要主实体的基本信息,不需要立刻加载其关联实体,而在另一些查询中则需要一次性加载所有关联实体。使用EntityGraph就可以根据不同的业务场景进行灵活配置。
  2. 减少数据库查询次数:通过指定需要加载的关联实体,可以避免多次的数据库查询(N + 1查询问题)。当一个查询返回多个实体,并且每个实体都有一个关联实体需要加载时,如果没有使用EntityGraph进行优化,可能会导致执行一个查询获取主实体列表,然后为每个主实体再执行一个查询来获取其关联实体,使用EntityGraph可以将这些查询合并为一个数据库查询。
  3. 提高查询性能:由于减少了数据库交互次数,整体的查询性能可以得到显著提升。尤其在处理大量数据和复杂的关联关系时,这一特性的优势更加明显。

EntityGraph的使用方法

以下是使用EntityGraph的具体步骤和示例代码:

1. 定义实体类

假设我们有两个实体类:OrderOrderLine,它们之间是一对多的关系。

import javax.persistence.*; import java.util.List; @Entity public class Order { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String orderNumber; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) private List<OrderLine> orderLines; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getOrderNumber() { return orderNumber; } public void setOrderNumber(String orderNumber) { this.orderNumber = orderNumber; } public List<OrderLine> getOrderLines() { return orderLines; } public void setOrderLines(List<OrderLine> orderLines) { this.orderLines = orderLines; } } @Entity public class OrderLine { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String productName; @ManyToOne @JoinColumn(name = "order_id") private Order order; // Getters and Setters public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getProductName() { return productName; } public void setProductName(String productName) { this.productName = productName; } public Order getOrder() { return order; } public void setOrder(Order order) { this.order = order; } }
2. 使用EntityGraph查询

在 DAO 层或服务层中使用EntityGraph进行查询。

import javax.persistence.EntityGraph; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.HashMap; import java.util.Map; public class OrderDao { @PersistenceContext private EntityManager entityManager; public Order findOrderWithOrderLines(Long orderId) { // 创建一个 EntityGraph 对象 EntityGraph<Order> graph = entityManager.createEntityGraph(Order.class); // 指定需要一并加载的属性 graph.addAttributeNodes("orderLines"); Map<String, Object> hints = new HashMap<>(); // 设置查询提示,使用我们创建的 EntityGraph hints.put("javax.persistence.fetchgraph", graph); // 执行查询 return entityManager.find(Order.class, orderId, hints); } }

在上述代码中:

  • 首先,通过entityManager.createEntityGraph(Order.class)创建了一个针对Order实体的EntityGraph对象。
  • 然后,调用graph.addAttributeNodes("orderLines")方法指定在查询Order实体时,需要一并加载其orderLines关联属性。
  • 接着,创建一个Map对象hints,并将javax.persistence.fetchgraph属性设置为我们创建的EntityGraph
  • 最后,调用entityManager.find(Order.class, orderId, hints)方法执行查询,此时会根据EntityGraph的配置进行加载。
3. 使用命名EntityGraph

除了上述动态创建EntityGraph的方式,还可以使用命名EntityGraph。在实体类上使用@NamedEntityGraph注解进行定义。

import javax.persistence.*; import java.util.List; @Entity @NamedEntityGraph(name = "Order.withOrderLines", attributeNodes = @NamedAttributeNode("orderLines")) public class Order { // ... 实体类的其他定义 ... }

在 DAO 层使用命名EntityGraph

import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import java.util.HashMap; import java.util.Map; public class OrderDao { @PersistenceContext private EntityManager entityManager; public Order findOrderWithOrderLinesUsingNamedGraph(Long orderId) { Map<String, Object> hints = new HashMap<>(); // 设置查询提示,使用命名 EntityGraph hints.put("javax.persistence.fetchgraph", entityManager.getEntityGraph("Order.withOrderLines")); return entityManager.find(Order.class, orderId, hints); } }

这种方式将EntityGraph的定义和查询分离,提高了代码的可读性和可维护性。

综上所述,EntityGraph是 JPA 中一个非常实用的特性,可以帮助开发人员更好地控制实体及其关联属性的加载,从而提高数据库查询的性能。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 0:11:57

【限时干货】:Open-AutoGLM快速部署的4大核心技巧曝光

第一章&#xff1a;Open-AutoGLM开源模型快速上手Open-AutoGLM 是一个基于 AutoGLM 架构的开源大语言模型&#xff0c;旨在为开发者提供高效、可定制的自然语言处理能力。其模块化设计和开放许可协议使其适用于从研究实验到生产部署的多种场景。环境准备与依赖安装 在开始使用 …

作者头像 李华
网站建设 2026/4/16 15:46:50

Open-AutoGLM最低配置 vs 理想配置,差了多少?实测数据告诉你真相

第一章&#xff1a;Open-AutoGLM配置要求概述Open-AutoGLM 是一个面向自动化代码生成与自然语言理解任务的开源框架&#xff0c;依赖于高性能计算资源和标准化运行环境。为确保系统稳定运行并充分发挥其推理与训练能力&#xff0c;部署前需满足一系列软硬件配置要求。硬件需求 …

作者头像 李华
网站建设 2026/4/15 9:38:24

Open-AutoGLM实战入门到精通(从配置到推理加速全解析)

第一章&#xff1a;Open-AutoGLM概述与核心价值Open-AutoGLM 是一个面向通用语言模型自动化任务的开源框架&#xff0c;旨在降低大模型应用开发门槛&#xff0c;提升从数据准备到模型部署的全流程效率。该框架融合了自动提示工程、智能上下文管理与分布式推理优化等核心技术&am…

作者头像 李华
网站建设 2026/4/16 13:41:01

京东商超购物码开店+LOC+入鼎+API对接自动核销全流程解析

个人名片 &#x1f393;作者简介&#xff1a;java领域优质创作者 &#x1f310;个人主页&#xff1a;码农阿豪 &#x1f4de;工作室&#xff1a;新空间代码工作室&#xff08;提供各种软件服务&#xff09; &#x1f48c;个人邮箱&#xff1a;[2435024119qq.com] &#x1f4f1…

作者头像 李华
网站建设 2026/4/18 2:05:24

诺奖、金牌与SOTA:谷歌2025八大领域核心突破年终回顾

2025年是AI从一种增强型功能彻底下沉为社会基础能源的关键转折点&#xff0c;Google通过全栈自研与生态标准的双轮驱动&#xff0c;构建起了一个不可替代的智能基础设施帝国。这一年&#xff0c;谷歌DeepMind与Research在模型推理、量子计算以及科学发现领域的突破&#xff0c;…

作者头像 李华
网站建设 2026/4/17 7:54:17

你真的懂Open-AutoGLM吗?90%工程师忽略的4个底层机制

第一章&#xff1a;Open-AutoGLM的核心定位与演进脉络Open-AutoGLM 是一个面向通用语言模型自动化任务的开源框架&#xff0c;旨在降低大模型应用开发门槛&#xff0c;提升从数据预处理到模型部署的全流程效率。该框架融合了AutoML理念与大语言模型&#xff08;LLM&#xff09;…

作者头像 李华