🔸TL;DR
▪️ @EntityGraph lets you override fetch strategy per query (fetch joins… but cleaner) ✅
▪️ Great to avoid N+1 and over-fetching at the same time 🎯
▪️ Works nicely with Spring Data JPA (@EntityGraph on repository methods) 🧩
🔸 THE PROBLEM IT SOLVES
You know the story 😅
▪️ LAZY everywhere → 💥 N+1 when you iterate
▪️ EAGER everywhere → 🐘 loads too much, hurts performance
▪️ join fetch in queries → ✅ works, but queries become verbose + hard to reuse
@EntityGraph gives you a 3rd way: keep mappings sane (often LAZY), and decide fetching at query time.
🔸 QUICK CONTEXT: WHAT IS AN ENTITY GRAPH?
An Entity Graph is basically a fetch plan:
▪️ which associations should be loaded now
▪️ which ones stay lazy for later
Hibernate translates it into optimized SQL (often via joins) 🧠
🔸 EXAMPLE DOMAIN
🔸 OPTION 1: DEFINE A NAMED ENTITY GRAPH ON THE ENTITY@Entity
Then use it in a query:
✅ loads customer + lines in one go (typically fewer queries)
🔸 OPTION 2: ADD SUBGRAPHS (DEEP FETCH)
You want lines.product too? Use a subgraph:
Now you can fetch:
▪️ Order
▪️ Order.customer
▪️ Order.lines
▪️ Order.lines.product
…without turning everything to EAGER 😌
🔸 SPRING DATA JPA: THE NICE & SIMPLE WAY
This is often the sweet spot:
▪️ no verbose JPQL
▪️ reusable fetch plan per method
▪️ clean repository code ✅
🔸 FETCHGRAPH VS LOADGRAPH (IMPORTANT)
There are two semantics:
▪️ fetchgraph: fetch only what the graph says (others treated as LAZY)
▪️ loadgraph: fetch the graph plus anything mapped as EAGER
In JPA hints:
Rule of thumb 👇
▪️ If you want tight control → fetchgraph
▪️ If you want “graph + defaults” → loadgraph
🔸 WHEN TO USE IT
▪️ Read endpoints (REST/GraphQL) where DTO needs a known shape 📦
▪️ Avoiding N+1 in lists (orders → lines → products) 🧯
▪️ Use-case specific fetch (same entity, different screens) 🖥️
🔸 TAKEAWAYS
▪️ Keep relations LAZY by default, and fetch intentionally 🎯
▪️ @EntityGraph = cleaner alternative to copy-pasted join fetch 🧼
▪️ Works great in Spring Data with attributePaths ✅
▪️ Use subgraphs for deep object graphs (but stay mindful of huge joins) ⚠️
#hibernate #jpa #springdata #springboot #java #backend #performance #database #orm #softwareengineering #nplusone #cleanarchitecture
Go further with Java certification:
Java👇
https://www.udemy.com/course/ocp-oracle-certified-professional-java-developer-prep/?referralCode=54114F9AD41F127CB99A
Spring👇
https://www.udemy.com/course/spring-professional-certification-6-full-tests-2v0-7222-a/?referralCode=04B6ED315B27753236AC
SpringBook👇
https://bit.ly/springtify
JavaBook👇
https://bit.ly/jroadmap