From 55580c7635d1124f37592e0c678c48e9d39a5d17 Mon Sep 17 00:00:00 2001 From: Petr Strnad Date: Sat, 18 Jun 2022 13:16:36 +0200 Subject: [PATCH] Fixed EntityGraphFactory overwriting subgraphs Closes #2527 --- .../jpa/repository/support/EntityGraphFactory.java | 11 +++++++++-- .../support/EntityGraphFactoryUnitTests.java | 4 +++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityGraphFactory.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityGraphFactory.java index 9e6c35a7ed..c1166bc9b3 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityGraphFactory.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/support/EntityGraphFactory.java @@ -15,6 +15,8 @@ */ package org.springframework.data.jpa.repository.support; +import java.util.HashMap; +import java.util.Map; import java.util.Set; import jakarta.persistence.EntityGraph; @@ -27,6 +29,7 @@ * Factory class to create an {@link EntityGraph} from a collection of property paths. * * @author Jens Schauder + * @author Petr Strnad * @since 2.6 */ abstract class EntityGraphFactory { @@ -42,16 +45,20 @@ abstract class EntityGraphFactory { public static EntityGraph create(EntityManager entityManager, Class domainType, Set properties) { EntityGraph entityGraph = entityManager.createEntityGraph(domainType); + Map> existingSubgraphs = new HashMap<>(); for (String property : properties) { Subgraph current = null; + String currentFullPath = ""; for (PropertyPath path : PropertyPath.from(property, domainType)) { + currentFullPath += path.getSegment() + "."; if (path.hasNext()) { - current = current == null ? entityGraph.addSubgraph(path.getSegment()) - : current.addSubgraph(path.getSegment()); + final Subgraph finalCurrent = current; + current = current == null ? existingSubgraphs.computeIfAbsent(currentFullPath, k -> entityGraph.addSubgraph(path.getSegment())) + : existingSubgraphs.computeIfAbsent(currentFullPath, k -> finalCurrent.addSubgraph(path.getSegment())); continue; } diff --git a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/EntityGraphFactoryUnitTests.java b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/EntityGraphFactoryUnitTests.java index 8dac763c79..1fc531becf 100644 --- a/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/EntityGraphFactoryUnitTests.java +++ b/spring-data-jpa/src/test/java/org/springframework/data/jpa/repository/support/EntityGraphFactoryUnitTests.java @@ -31,6 +31,7 @@ * Unit tests for {@link EntityGraphFactory}. * * @author Jens Schauder + * @author Petr Strnad */ @SuppressWarnings("rawtypes") class EntityGraphFactoryUnitTests { @@ -61,12 +62,13 @@ void simpleSetOfPropertiesGetRegistered() { @Test void setOfCompositePropertiesGetRegisteredPiecewise() { - HashSet properties = new HashSet<>(asList("one.two", "eins.zwei.drei")); + HashSet properties = new HashSet<>(asList("one.one", "one.two", "eins.zwei.drei")); entityGraph = EntityGraphFactory.create(em, DummyEntity.class, properties); verify(entityGraph).addSubgraph("one"); Subgraph one = entityGraph.addSubgraph("one"); + verify(one).addAttributeNodes("one"); verify(one).addAttributeNodes("two"); verify(entityGraph).addSubgraph("eins");