Skip to content

Commit 85fb93e

Browse files
committed
Ensure that JPA metamodel cache is cleared when lazy init is enabled
Closes gh-46630
1 parent c9c8076 commit 85fb93e

File tree

2 files changed

+25
-0
lines changed

2 files changed

+25
-0
lines changed

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

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

2121
import javax.sql.DataSource;
2222

23+
import org.springframework.boot.LazyInitializationExcludeFilter;
2324
import org.springframework.boot.autoconfigure.AutoConfiguration;
2425
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
2526
import org.springframework.boot.autoconfigure.condition.AnyNestedCondition;
@@ -91,6 +92,11 @@ public EntityManagerFactoryBuilderCustomizer entityManagerFactoryBootstrapExecut
9192
};
9293
}
9394

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

spring-boot-project/spring-boot-autoconfigure/src/test/java/org/springframework/boot/autoconfigure/data/jpa/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.autoconfigure.data.jpa;
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;
@@ -40,8 +44,10 @@
4044
import org.springframework.context.annotation.Import;
4145
import org.springframework.core.task.SimpleAsyncTaskExecutor;
4246
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
47+
import org.springframework.data.jpa.util.JpaMetamodel;
4348
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
4449
import org.springframework.scheduling.annotation.EnableScheduling;
50+
import org.springframework.test.util.ReflectionTestUtils;
4551
import org.springframework.transaction.PlatformTransactionManager;
4652

4753
import static org.assertj.core.api.Assertions.assertThat;
@@ -138,6 +144,19 @@ void bootstrapModeIsDefaultByDefault() {
138144
.isNull());
139145
}
140146

147+
@Test
148+
void whenLazyInitializationIsEnabledJpaMetamodelCacheIsClearedOnContextClose() {
149+
this.contextRunner.withUserConfiguration(TestConfiguration.class)
150+
.withBean(LazyInitializationBeanFactoryPostProcessor.class)
151+
.run((context) -> assertThat(jpaMetamodelCache()).isNotEmpty());
152+
assertThat(jpaMetamodelCache()).isEmpty();
153+
}
154+
155+
@SuppressWarnings("unchecked")
156+
private Map<Metamodel, JpaMetamodel> jpaMetamodelCache() {
157+
return (Map<Metamodel, JpaMetamodel>) ReflectionTestUtils.getField(JpaMetamodel.class, "CACHE");
158+
}
159+
141160
@Configuration(proxyBeanMethods = false)
142161
@EnableScheduling
143162
@Import(TestConfiguration.class)

0 commit comments

Comments
 (0)