Carga de asociaciones en consultas con EntityGraph y anotaciones

Avanzado
Hibernate
Hibernate
Actualizado: 17/06/2025

¡Desbloquea el curso completo!

IA
Ejercicios
Certificado
Entrar

Introducción

Además de definir EntityGraphs de manera programática, Hibernate permite definir EntityGraphs de manera estática utilizando anotaciones directamente en las clases de entidad. Esto proporciona una forma declarativa de especificar las cargas de entidades, que puede ser más limpia y menos propensa a errores en ciertos contextos.

Anotaciones

  • @NamedEntityGraph: Se utiliza para definir un EntityGraph a nivel de clase de entidad en JPA. Permite especificar un conjunto de atributos y relaciones que deben cargarse de manera Eager o Lazy cuando se utiliza el EntityGraph en una consulta. Puede contener múltiples @NamedAttributeNode y @NamedSubgraph para detallar la estructura del grafo.
  • @NamedAttributeNode: Define un atributo específico de una entidad que debe ser incluido en el EntityGraph. Puede ser un atributo simple o una relación a otra entidad. En caso de ser una relación, puede asociarse a un @NamedSubgraph para especificar más detalles sobre cómo cargar la entidad relacionada.
  • @NamedSubgraph: Se utiliza dentro de un @NamedAttributeNode cuando el atributo es una relación a otra entidad. Permite definir un subconjunto de atributos de la entidad relacionada que también deben cargarse de manera Eager o Lazy. Proporciona una manera de gestionar cargas más complejas y detalladas de entidades relacionadas dentro de un EntityGraph.

Ejemplo de anotación de una entidad mediante EntityGraph:

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.NamedEntityGraph;
import jakarta.persistence.NamedAttributeNode;
import jakarta.persistence.NamedSubgraph;

@Entity
@NamedEntityGraph(
    name = "empleadoDetalle",
    attributeNodes = {
        @NamedAttributeNode(value = "nombre"),
        @NamedAttributeNode(value = "apellido"),
        @NamedAttributeNode(value = "departamento", subgraph = "departamentoDetalle")
    },
    subgraphs = {
        @NamedSubgraph(
            name = "departamentoDetalle",
            attributeNodes = {
                @NamedAttributeNode("nombre")
            }
        )
    }
)
public class Empleado {
    // campos de la entidad, getters y setters
}

Ejemplo de consulta:

Guarda tu progreso

Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.

Progreso guardado
Asistente IA
Ejercicios
Iniciar sesión gratis

Más de 25.000 desarrolladores ya confían en CertiDevs

import jakarta.persistence.EntityManager;
import jakarta.persistence.EntityGraph;
import jakarta.persistence.TypedQuery;

EntityManager em = ...; // Obtener el EntityManager
EntityGraph<?> graph = em.getEntityGraph("empleadoDetalle");

TypedQuery<Empleado> query = em.createQuery("SELECT e FROM Empleado e WHERE e.id = :idEmpleado", Empleado.class);
query.setParameter("idEmpleado", 1);
query.setHint("jakarta.persistence.loadgraph", graph);
Empleado empleado = query.getSingleResult();

En este ejemplo, el EntityGraph llamado “empleadoDetalle” se utiliza para cargar un empleado con su nombre, apellido, y detalles del departamento asociado, de acuerdo con lo especificado en las anotaciones de la clase Empleado.

Otras anotaciones de EntityGraph usadas en JPA son:

  • @EntityGraph: Esta anotación se puede usar directamente en métodos de repositorios para definir dinámicamente un EntityGraph que se aplicará durante la ejecución de una consulta particular. Es común en Spring Data JPA.
  • @NamedEntityGraphs: Es una anotación contenedora que permite especificar múltiples @NamedEntityGraph en una sola clase de entidad. Esto es útil para definir diferentes configuraciones de carga de entidades en la misma clase según diferentes contextos o necesidades.

Aprendizajes de esta lección

  1. Comprender cómo definir y utilizar EntityGraphs en Hibernate mediante anotaciones.
  2. Comprender la función de la anotación @NamedEntityGraph y cómo se utiliza para definir configuraciones de carga de entidades a nivel de clase.
  3. Aprender a emplear @NamedAttributeNode para especificar atributos individuales de una entidad que deben incluirse en un EntityGraph.
  4. Familiarizarse con el uso de @NamedSubgraph dentro de @NamedAttributeNode para definir un subconjunto de atributos de entidades relacionadas y gestionar cargas complejas de entidades.

Completa Hibernate y certifícate

Únete a nuestra plataforma y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.

Asistente IA

Resuelve dudas al instante

Ejercicios

Practica con proyectos reales

Certificados

Valida tus conocimientos

Más de 25.000 desarrolladores ya se han certificado con CertiDevs

⭐⭐⭐⭐⭐
4.9/5 valoración