From 4fb6c19904e501e4a78b5ca0c5d8331f6559b0c8 Mon Sep 17 00:00:00 2001 From: Jungho Kim Date: Wed, 24 Dec 2025 17:22:23 +0900 Subject: [PATCH] refactor: improve entity stability and refactor tag addition logic - Remove Lombok @Data to prevent hashcode inconsistency in Set - Change ID generation strategy to GenerationType.IDENTITY - Refactor test code to use IntStream for bulk tag creation - Ensure encapsulation by replacing @Data with @Getter --- .../springdata/jpa/fetchgraph/Product.java | 8 ++++++-- .../springdata/jpa/fetchgraph/Tag.java | 12 ++++++++++-- .../FetchGraphIntegrationTests.java | 19 ++++++++++++------- 3 files changed, 28 insertions(+), 11 deletions(-) diff --git a/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Product.java b/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Product.java index aa146d4bc..bfc2484cf 100644 --- a/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Product.java +++ b/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Product.java @@ -15,7 +15,9 @@ */ package example.springdata.jpa.fetchgraph; +import jakarta.persistence.GenerationType; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; import java.util.HashSet; @@ -30,17 +32,19 @@ import jakarta.persistence.NamedAttributeNode; import jakarta.persistence.NamedEntityGraph; import jakarta.persistence.NamedEntityGraphs; +import lombok.Setter; /** * @author Thomas Darimont */ -@Data @NoArgsConstructor @Entity @NamedEntityGraphs(@NamedEntityGraph(name = "product-with-tags", attributeNodes = { @NamedAttributeNode("tags") })) +@Getter +@Setter public class Product { - @Id @GeneratedValue // + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; String name; diff --git a/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Tag.java b/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Tag.java index 5d4a77b64..433ff615a 100644 --- a/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Tag.java +++ b/jpa/jpa21/src/main/java/example/springdata/jpa/fetchgraph/Tag.java @@ -15,22 +15,27 @@ */ package example.springdata.jpa.fetchgraph; +import jakarta.persistence.GenerationType; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; import jakarta.persistence.Id; +import lombok.Setter; /** * @author Thomas Darimont */ -@Data + @NoArgsConstructor @Entity +@Getter +@Setter public class Tag { - @Id @GeneratedValue // + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) Long id; String name; @@ -38,4 +43,7 @@ public class Tag { public Tag(String name) { this.name = name; } + public static Tag createTestTag(int num){ + return new Tag(String.format("Tag%d", num)); + } } diff --git a/jpa/jpa21/src/test/java/example/springdata/jpa/fetchgraph/FetchGraphIntegrationTests.java b/jpa/jpa21/src/test/java/example/springdata/jpa/fetchgraph/FetchGraphIntegrationTests.java index 569a405e9..6b8e1bee5 100644 --- a/jpa/jpa21/src/test/java/example/springdata/jpa/fetchgraph/FetchGraphIntegrationTests.java +++ b/jpa/jpa21/src/test/java/example/springdata/jpa/fetchgraph/FetchGraphIntegrationTests.java @@ -15,15 +15,14 @@ */ package example.springdata.jpa.fetchgraph; -import static org.assertj.core.api.Assertions.*; - -import java.util.Collections; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatExceptionOfType; import jakarta.persistence.EntityManager; - +import java.util.Collections; +import java.util.stream.IntStream; import org.hibernate.LazyInitializationException; import org.junit.jupiter.api.Test; - import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.transaction.annotation.Transactional; @@ -47,7 +46,13 @@ class FetchGraphIntegrationTests { void shouldFetchAssociationMarkedAsLazyViaNamedEntityFetchGraph() { var xps = new Product("Dell XPS 15"); - Collections.addAll(xps.getTags(), new Tag("cool"), new Tag("macbook-killer"), new Tag("speed")); + var expectedSize = 10; + + Tag[] arr = IntStream.range(0, expectedSize) + .mapToObj(Tag::createTestTag) + .toArray(Tag[]::new); + + Collections.addAll(xps.getTags(), arr); xps = repository.save(xps); repository.flush(); @@ -64,7 +69,7 @@ void shouldFetchAssociationMarkedAsLazyViaNamedEntityFetchGraph() { // here we use the findWithNamedEntityGraphById that uses a NamedEntityGraph var loadedXpsWithFetchGraph = repository.findWithNamedEntityGraphById(xps.getId()); - assertThat(loadedXpsWithFetchGraph.getTags()).hasSize(3); + assertThat(loadedXpsWithFetchGraph.getTags()).hasSize(expectedSize); } @Test