From 01e4e756178dd21dfc25d20df065fd7d2a44bdf5 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Thu, 8 May 2025 16:45:09 +0200 Subject: [PATCH] Use isolated Hibernate `EntityManager` for AOT contribution. Closes #3876 --- .../aot/JpaRepositoryContributor.java | 2 ++ .../config/JpaRepositoryConfigExtension.java | 19 +++++++++++++++---- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRepositoryContributor.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRepositoryContributor.java index cc921ff78..01d7c92f0 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRepositoryContributor.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRepositoryContributor.java @@ -68,6 +68,7 @@ public class JpaRepositoryContributor extends RepositoryContributor { private final EntityGraphLookup entityGraphLookup; public JpaRepositoryContributor(AotRepositoryContext repositoryContext) { + super(repositoryContext); AotMetamodel amm = new AotMetamodel(repositoryContext.getResolvedTypes()); @@ -78,6 +79,7 @@ public class JpaRepositoryContributor extends RepositoryContributor { } public JpaRepositoryContributor(AotRepositoryContext repositoryContext, EntityManagerFactory entityManagerFactory) { + super(repositoryContext); this.persistenceProvider = PersistenceProvider.fromEntityManagerFactory(entityManagerFactory); diff --git a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/config/JpaRepositoryConfigExtension.java b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/config/JpaRepositoryConfigExtension.java index eb89f0af8..ce3218593 100644 --- a/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/config/JpaRepositoryConfigExtension.java +++ b/spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/config/JpaRepositoryConfigExtension.java @@ -325,6 +325,8 @@ public class JpaRepositoryConfigExtension extends RepositoryConfigurationExtensi */ public static class JpaRepositoryRegistrationAotProcessor extends RepositoryRegistrationAotProcessor { + String GENERATED_REPOSITORIES_JPA_USE_ENTITY_MANAGER = "spring.aot.jpa.repositories.use-entitymanager"; + protected @Nullable RepositoryContributor contribute(AotRepositoryContext repositoryContext, GenerationContext generationContext) { @@ -334,11 +336,20 @@ public class JpaRepositoryConfigExtension extends RepositoryConfigurationExtensi return null; } - ConfigurableListableBeanFactory beanFactory = repositoryContext.getBeanFactory(); - EntityManagerFactory emf = beanFactory.getBeanProvider(EntityManagerFactory.class).getIfAvailable(); + boolean useEntityManager = Boolean.parseBoolean( + repositoryContext.getEnvironment().getProperty(GENERATED_REPOSITORIES_JPA_USE_ENTITY_MANAGER, "false")); - return emf != null ? new JpaRepositoryContributor(repositoryContext, emf) - : new JpaRepositoryContributor(repositoryContext); + if (useEntityManager) { + + ConfigurableListableBeanFactory beanFactory = repositoryContext.getBeanFactory(); + EntityManagerFactory emf = beanFactory.getBeanProvider(EntityManagerFactory.class).getIfAvailable(); + + if (emf != null) { + return new JpaRepositoryContributor(repositoryContext, emf); + } + } + + return new JpaRepositoryContributor(repositoryContext); } } }