Bird
Raised Fist0
Spring Bootframework~5 mins

Fetch types (LAZY vs EAGER) in Spring Boot

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction

Fetch types decide when related data is loaded from the database. They help control performance and memory use.

When you want to load related data only when needed to save resources.
When you want to load all related data immediately for quick access.
When working with large data sets and want to avoid slow queries.
When you want to avoid unexpected database calls during object use.
When designing APIs that return nested data and want control over loading.
Syntax
Spring Boot
@OneToMany(fetch = FetchType.LAZY)
private List<Item> items;

@OneToMany(fetch = FetchType.EAGER)
private List<Item> items;

Use fetch = FetchType.LAZY to load data only when accessed.

Use fetch = FetchType.EAGER to load data immediately with the main entity.

Examples
Orders are loaded only when you call getOrders().
Spring Boot
@OneToMany(fetch = FetchType.LAZY)
private List<Order> orders;
Customer data loads immediately with the main entity.
Spring Boot
@ManyToOne(fetch = FetchType.EAGER)
private Customer customer;
Profile loads only when accessed, saving resources if unused.
Spring Boot
@OneToOne(fetch = FetchType.LAZY)
private Profile profile;
Sample Program

This example shows a User with many Posts. Posts load only when accessed (LAZY). Each Post loads its User immediately (EAGER). This balances performance and convenience.

Spring Boot
import jakarta.persistence.*;
import java.util.List;

@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    @OneToMany(fetch = FetchType.LAZY, mappedBy = "user")
    private List<Post> posts;

    public User() {}

    public User(String name) {
        this.name = name;
    }

    public List<Post> getPosts() {
        return posts;
    }

    public String getName() {
        return name;
    }
}

@Entity
public class Post {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String content;

    @ManyToOne(fetch = FetchType.EAGER)
    private User user;

    public Post() {}

    public Post(String content, User user) {
        this.content = content;
        this.user = user;
    }

    public String getContent() {
        return content;
    }

    public User getUser() {
        return user;
    }
}

// Explanation:
// When loading a User, posts are not loaded immediately (LAZY).
// When loading a Post, the User is loaded immediately (EAGER).
// This helps avoid loading all posts unless needed, but always loads the user with a post.
OutputSuccess
Important Notes

LAZY loading can cause errors if accessed outside a database session.

EAGER loading can slow down queries if many related objects exist.

Choose fetch type based on how and when you need related data.

Summary

Fetch types control when related data loads: LAZY delays loading, EAGER loads immediately.

Use LAZY to save resources and EAGER for quick access to related data.

Pick the right fetch type to balance performance and convenience in your app.

Practice

(1/5)
1. What does the LAZY fetch type do in Spring Boot JPA?
easy
A. It disables loading of related entities completely.
B. It loads all related entities immediately with the main entity.
C. It delays loading related entities until they are accessed.
D. It loads related entities only during application startup.

Solution

  1. Step 1: Understand fetch types in JPA

    Fetch types control when related data is loaded from the database.
  2. Step 2: Define LAZY fetch behavior

    LAZY means related entities are loaded only when you access them, not immediately.
  3. Final Answer:

    It delays loading related entities until they are accessed. -> Option C
  4. Quick Check:

    LAZY = delayed loading [OK]
Hint: LAZY means wait to load until needed [OK]
Common Mistakes:
  • Confusing LAZY with EAGER loading
  • Thinking LAZY loads data immediately
  • Assuming LAZY disables loading
2. Which is the correct way to specify EAGER fetching on a JPA relationship in Spring Boot?
easy
A. @ManyToOne(fetch = FetchType.EAGER)
B. @OneToMany(fetch = FetchType.LAZY)
C. @OneToOne(fetch = FetchType.LAZY)
D. @ManyToMany(fetch = FetchType.LAZY)

Solution

  1. Step 1: Identify correct annotation and fetch type

    EAGER fetch type is set using fetch = FetchType.EAGER inside relationship annotations.
  2. Step 2: Match correct relationship and fetch type

    @ManyToOne(fetch = FetchType.EAGER) uses @ManyToOne(fetch = FetchType.EAGER), which is valid and correct.
  3. Final Answer:

    @ManyToOne(fetch = FetchType.EAGER) -> Option A
  4. Quick Check:

    EAGER fetch uses FetchType.EAGER [OK]
Hint: EAGER fetch uses FetchType.EAGER in annotation [OK]
Common Mistakes:
  • Using LAZY instead of EAGER for eager loading
  • Mixing relationship types with wrong fetch types
  • Forgetting to specify fetch attribute
3. Given the following code snippet, what will happen when order.getItems() is called if items is marked with fetch = FetchType.LAZY?
@Entity
class Order {
  @OneToMany(fetch = FetchType.LAZY)
  private List<Item> items;
}
Order order = entityManager.find(Order.class, 1L);
// No call to getItems() yet
medium
A. The items list is loaded immediately when the order is fetched.
B. The items list is never loaded, causing a null pointer exception.
C. The items list is loaded during application startup.
D. The items list is loaded only when getItems() is called.

Solution

  1. Step 1: Understand LAZY fetch behavior on collections

    With LAZY fetch, related collections like items are not loaded immediately.
  2. Step 2: When is data loaded?

    The data loads only when the getter getItems() is called, triggering the fetch.
  3. Final Answer:

    The items list is loaded only when getItems() is called. -> Option D
  4. Quick Check:

    LAZY fetch loads on access [OK]
Hint: LAZY loads collections only on getter call [OK]
Common Mistakes:
  • Assuming collections load immediately with LAZY
  • Expecting null instead of a proxy collection
  • Confusing LAZY with EAGER behavior
4. You have a @OneToMany(fetch = FetchType.LAZY) relationship, but you get a LazyInitializationException when accessing the collection outside a transaction. What is the likely cause?
medium
A. The fetch type should be LAZY, so this exception is unexpected.
B. The collection was accessed after the session was closed.
C. The entity was not annotated with @Entity.
D. The database connection is lost.

Solution

  1. Step 1: Understand LazyInitializationException cause

    This exception happens when a LAZY collection is accessed outside an open session or transaction.
  2. Step 2: Identify session state during access

    If the session is closed before accessing the collection, the proxy cannot load data, causing the exception.
  3. Final Answer:

    The collection was accessed after the session was closed. -> Option B
  4. Quick Check:

    LazyInitializationException = access after session close [OK]
Hint: Access LAZY data only inside open session/transaction [OK]
Common Mistakes:
  • Thinking fetch type alone prevents exceptions
  • Ignoring session lifecycle in JPA
  • Blaming database connection instead
5. You have an entity Author with a @OneToMany(fetch = FetchType.LAZY) relationship to Book. You want to display all authors with their books immediately to avoid multiple queries later. Which approach is best?
hard
A. Keep LAZY fetch and use a JPQL query with JOIN FETCH to load books eagerly.
B. Use native SQL queries only to load all data at once.
C. Load authors and books separately in two queries and merge in Java code.
D. Change the fetch type to EAGER on the relationship.

Solution

  1. Step 1: Understand pros and cons of fetch types

    Changing to EAGER can cause performance issues if not always needed.
  2. Step 2: Use JOIN FETCH for selective eager loading

    JPQL with JOIN FETCH loads related entities eagerly only when needed, avoiding multiple queries.
  3. Step 3: Evaluate other options

    Loading separately or using native queries is less efficient or more complex.
  4. Final Answer:

    Keep LAZY fetch and use a JPQL query with JOIN FETCH to load books eagerly. -> Option A
  5. Quick Check:

    JOIN FETCH = selective eager loading [OK]
Hint: Use JOIN FETCH query to eagerly load LAZY relations [OK]
Common Mistakes:
  • Switching to EAGER globally causing overhead
  • Ignoring JPQL JOIN FETCH option
  • Overcomplicating with native queries