From 50dcd425e3e2ea52342576943f531a3ff3553b1e Mon Sep 17 00:00:00 2001 From: Ravindra Bijarniya Date: Mon, 12 Jan 2026 15:20:40 +0530 Subject: [PATCH] Use LAZY fetch for owner pets and load associations explicitly with EntityGraph Signed-off-by: Ravindra Bijarniya --- .../samples/petclinic/owner/Owner.java | 2 +- .../petclinic/owner/OwnerRepository.java | 5 ++++ .../petclinic/owner/OwnerRepositoryTests.java | 30 +++++++++++++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) create mode 100644 src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTests.java diff --git a/src/main/java/org/springframework/samples/petclinic/owner/Owner.java b/src/main/java/org/springframework/samples/petclinic/owner/Owner.java index 480a7a690..216cea6e0 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/Owner.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/Owner.java @@ -61,7 +61,7 @@ public class Owner extends Person { @Pattern(regexp = "\\d{10}", message = "{telephone.invalid}") private String telephone; - @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER) + @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY) @JoinColumn(name = "owner_id") @OrderBy("name") private final List pets = new ArrayList<>(); diff --git a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java index d2b3dde40..a2143514e 100644 --- a/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java +++ b/src/main/java/org/springframework/samples/petclinic/owner/OwnerRepository.java @@ -19,6 +19,7 @@ import java.util.Optional; import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; +import org.springframework.data.jpa.repository.EntityGraph; import org.springframework.data.jpa.repository.JpaRepository; /** @@ -42,6 +43,7 @@ public interface OwnerRepository extends JpaRepository { * @return a Collection of matching {@link Owner}s (or an empty Collection if none * found) */ + @EntityGraph(attributePaths = {"pets", "pets.type"}) Page findByLastNameStartingWith(String lastName, Pageable pageable); /** @@ -57,6 +59,9 @@ public interface OwnerRepository extends JpaRepository { * @throws IllegalArgumentException if the id is null (assuming null is not a valid * input for id) */ + @Override + @EntityGraph(attributePaths = {"pets", "pets.type", "pets.visits"}) Optional findById(Integer id); + } diff --git a/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTests.java b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTests.java new file mode 100644 index 000000000..ce82586ac --- /dev/null +++ b/src/test/java/org/springframework/samples/petclinic/owner/OwnerRepositoryTests.java @@ -0,0 +1,30 @@ +package org.springframework.samples.petclinic.owner; + +import static org.assertj.core.api.Assertions.assertThat; + +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; +import org.springframework.transaction.annotation.Transactional; + +@SpringBootTest +@Transactional +class OwnerRepositoryTests { + + @Autowired + private OwnerRepository ownerRepository; + + @Test + void shouldFetchOwnersWithPetsUsingEntityGraph() { + Page owners = + ownerRepository.findByLastNameStartingWith("D", PageRequest.of(0, 10)); + + assertThat(owners).isNotEmpty(); + + Owner owner = owners.getContent().get(0); + + assertThat(owner.getPets()).isNotNull(); + } +}