|
17 | 17 |
|
18 | 18 | import static org.springframework.data.jpa.repository.config.BeanDefinitionNames.*;
|
19 | 19 |
|
| 20 | +import jakarta.persistence.Entity; |
| 21 | +import jakarta.persistence.MappedSuperclass; |
| 22 | +import jakarta.persistence.PersistenceContext; |
| 23 | +import jakarta.persistence.PersistenceUnit; |
| 24 | + |
20 | 25 | import java.lang.annotation.Annotation;
|
21 | 26 | import java.util.Arrays;
|
22 | 27 | import java.util.Collection;
|
23 | 28 | import java.util.Collections;
|
| 29 | +import java.util.LinkedHashMap; |
24 | 30 | import java.util.LinkedHashSet;
|
25 | 31 | import java.util.Locale;
|
| 32 | +import java.util.Map; |
26 | 33 | import java.util.Optional;
|
27 | 34 | import java.util.Set;
|
28 | 35 |
|
29 |
| -import jakarta.persistence.Entity; |
30 |
| -import jakarta.persistence.MappedSuperclass; |
31 |
| -import jakarta.persistence.PersistenceContext; |
32 |
| -import jakarta.persistence.PersistenceUnit; |
33 |
| - |
| 36 | +import org.springframework.beans.factory.config.BeanDefinition; |
34 | 37 | import org.springframework.beans.factory.support.AbstractBeanDefinition;
|
35 | 38 | import org.springframework.beans.factory.support.BeanDefinitionBuilder;
|
| 39 | +import org.springframework.beans.factory.support.BeanDefinitionReaderUtils; |
36 | 40 | import org.springframework.beans.factory.support.BeanDefinitionRegistry;
|
37 | 41 | import org.springframework.beans.factory.support.RootBeanDefinition;
|
38 | 42 | import org.springframework.context.annotation.AnnotationConfigUtils;
|
@@ -77,6 +81,8 @@ public class JpaRepositoryConfigExtension extends RepositoryConfigurationExtensi
|
77 | 81 | private static final String JPA_METAMODEL_CACHE_CLEANUP_CLASSNAME = "org.springframework.data.jpa.util.JpaMetamodelCacheCleanup";
|
78 | 82 | private static final String ESCAPE_CHARACTER_PROPERTY = "escapeCharacter";
|
79 | 83 |
|
| 84 | + private final Map<Object, String> entityManagerRefs = new LinkedHashMap<>(); |
| 85 | + |
80 | 86 | @Override
|
81 | 87 | public String getModuleName() {
|
82 | 88 | return "JPA";
|
@@ -107,7 +113,7 @@ public void postProcess(BeanDefinitionBuilder builder, RepositoryConfigurationSo
|
107 | 113 |
|
108 | 114 | Optional<String> transactionManagerRef = source.getAttribute("transactionManagerRef");
|
109 | 115 | builder.addPropertyValue("transactionManager", transactionManagerRef.orElse(DEFAULT_TRANSACTION_MANAGER_BEAN_NAME));
|
110 |
| - builder.addPropertyValue("entityManager", getEntityManagerBeanDefinitionFor(source, source.getSource())); |
| 116 | + builder.addPropertyReference("entityManager", entityManagerRefs.get(source)); |
111 | 117 | builder.addPropertyValue(ESCAPE_CHARACTER_PROPERTY, getEscapeCharacter(source).orElse('\\'));
|
112 | 118 | builder.addPropertyReference("mappingContext", JPA_MAPPING_CONTEXT_BEAN_NAME);
|
113 | 119 | }
|
@@ -149,6 +155,8 @@ public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConf
|
149 | 155 |
|
150 | 156 | super.registerBeansForRoot(registry, config);
|
151 | 157 |
|
| 158 | + prepareAndRegisterSharedEntityManger(registry, config); |
| 159 | + |
152 | 160 | Object source = config.getSource();
|
153 | 161 |
|
154 | 162 | registerLazyIfNotAlreadyRegistered(
|
@@ -191,6 +199,21 @@ public void registerBeansForRoot(BeanDefinitionRegistry registry, RepositoryConf
|
191 | 199 | }, registry, JpaEvaluationContextExtension.class.getName(), source);
|
192 | 200 | }
|
193 | 201 |
|
| 202 | + private String prepareAndRegisterSharedEntityManger(BeanDefinitionRegistry registry, |
| 203 | + RepositoryConfigurationSource config) { |
| 204 | + |
| 205 | + AbstractBeanDefinition entityManager = getEntityManagerBeanDefinitionFor(config, null); |
| 206 | + entityManager.setRole(BeanDefinition.ROLE_SUPPORT); |
| 207 | + entityManager.setSynthetic(true); |
| 208 | + entityManager.setPrimary(false); |
| 209 | + entityManager.setAutowireCandidate(false); |
| 210 | + |
| 211 | + String entityManagerBeanName = BeanDefinitionReaderUtils.uniqueBeanName("jpaSharedEM", registry); |
| 212 | + entityManagerRefs.put(config, entityManagerBeanName); |
| 213 | + registry.registerBeanDefinition(entityManagerBeanName, entityManager); |
| 214 | + return entityManagerBeanName; |
| 215 | + } |
| 216 | + |
194 | 217 | @Override
|
195 | 218 | protected ClassLoader getConfigurationInspectionClassLoader(ResourceLoader loader) {
|
196 | 219 |
|
|
0 commit comments