Skip to content

Commit 80ff7cb

Browse files
committed
Merge branch '3.5.x'
Closes gh-46635
2 parents 395ffb2 + 09ed59f commit 80ff7cb

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

module/spring-boot-data-jpa/src/main/java/org/springframework/boot/data/jpa/autoconfigure/JpaRepositoriesAutoConfiguration.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222

2323
import org.jspecify.annotations.Nullable;
2424

25+
import org.springframework.boot.LazyInitializationExcludeFilter;
2526
import org.springframework.boot.autoconfigure.AutoConfiguration;
2627
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2728
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
@@ -93,6 +94,11 @@ EntityManagerFactoryBuilderCustomizer entityManagerFactoryBootstrapExecutorCusto
9394
};
9495
}
9596

97+
@Bean
98+
static LazyInitializationExcludeFilter eagerJpaMetamodelCacheCleanup() {
99+
return (name, definition, type) -> "org.springframework.data.jpa.util.JpaMetamodelCacheCleanup".equals(name);
100+
}
101+
96102
private @Nullable AsyncTaskExecutor determineBootstrapExecutor(Map<String, AsyncTaskExecutor> taskExecutors) {
97103
if (taskExecutors.size() == 1) {
98104
return taskExecutors.values().iterator().next();

module/spring-boot-data-jpa/src/test/java/org/springframework/boot/data/jpa/autoconfigure/AbstractJpaRepositoriesAutoConfigurationTests.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,13 @@
1616

1717
package org.springframework.boot.data.jpa.autoconfigure;
1818

19+
import java.util.Map;
20+
1921
import jakarta.persistence.EntityManagerFactory;
22+
import jakarta.persistence.metamodel.Metamodel;
2023
import org.junit.jupiter.api.Test;
2124

25+
import org.springframework.boot.LazyInitializationBeanFactoryPostProcessor;
2226
import org.springframework.boot.autoconfigure.AutoConfigurations;
2327
import org.springframework.boot.autoconfigure.TestAutoConfigurationPackage;
2428
import org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration;
@@ -35,8 +39,10 @@
3539
import org.springframework.context.annotation.Import;
3640
import org.springframework.core.task.SimpleAsyncTaskExecutor;
3741
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
42+
import org.springframework.data.jpa.util.JpaMetamodel;
3843
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
3944
import org.springframework.scheduling.annotation.EnableScheduling;
45+
import org.springframework.test.util.ReflectionTestUtils;
4046
import org.springframework.transaction.PlatformTransactionManager;
4147

4248
import static org.assertj.core.api.Assertions.assertThat;
@@ -133,6 +139,19 @@ void bootstrapModeIsDefaultByDefault() {
133139
.isNull());
134140
}
135141

142+
@Test
143+
void whenLazyInitializationIsEnabledJpaMetamodelCacheIsClearedOnContextClose() {
144+
this.contextRunner.withUserConfiguration(TestConfiguration.class)
145+
.withBean(LazyInitializationBeanFactoryPostProcessor.class)
146+
.run((context) -> assertThat(jpaMetamodelCache()).isNotEmpty());
147+
assertThat(jpaMetamodelCache()).isEmpty();
148+
}
149+
150+
@SuppressWarnings("unchecked")
151+
private Map<Metamodel, JpaMetamodel> jpaMetamodelCache() {
152+
return (Map<Metamodel, JpaMetamodel>) ReflectionTestUtils.getField(JpaMetamodel.class, "CACHE");
153+
}
154+
136155
@Configuration(proxyBeanMethods = false)
137156
@EnableScheduling
138157
@Import(TestConfiguration.class)

0 commit comments

Comments
 (0)