Skip to content

Commit 89bc5e2

Browse files
Switch to SpringPersistenceUnitInfo for AOT processing.
Fix nullable constraints along the way. Closes: #4039
1 parent c182999 commit 89bc5e2

File tree

6 files changed

+24
-63
lines changed

6 files changed

+24
-63
lines changed

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/AotMetamodel.java

Lines changed: 6 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,10 @@
2121
import jakarta.persistence.metamodel.EntityType;
2222
import jakarta.persistence.metamodel.ManagedType;
2323
import jakarta.persistence.metamodel.Metamodel;
24-
import jakarta.persistence.spi.ClassTransformer;
2524
import jakarta.persistence.spi.PersistenceUnitInfo;
2625

2726
import java.net.URL;
2827
import java.util.Collection;
29-
import java.util.List;
3028
import java.util.Map;
3129
import java.util.Set;
3230
import java.util.function.Supplier;
@@ -38,12 +36,10 @@
3836
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
3937
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
4038
import org.jspecify.annotations.Nullable;
41-
4239
import org.springframework.data.repository.config.AotRepositoryContext;
4340
import org.springframework.data.util.Lazy;
44-
import org.springframework.instrument.classloading.SimpleThrowawayClassLoader;
45-
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
4641
import org.springframework.orm.jpa.persistenceunit.PersistenceManagedTypes;
42+
import org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo;
4743

4844
/**
4945
* AOT metamodel implementation that uses Hibernate to build the metamodel.
@@ -76,38 +72,17 @@ public AotMetamodel(PersistenceManagedTypes managedTypes) {
7672

7773
public AotMetamodel(Collection<String> managedTypes, @Nullable URL persistenceUnitRootUrl) {
7874

79-
MutablePersistenceUnitInfo persistenceUnitInfo = new MutablePersistenceUnitInfo() {
80-
@Override
81-
public ClassLoader getNewTempClassLoader() {
82-
return new SimpleThrowawayClassLoader(this.getClass().getClassLoader());
83-
}
84-
85-
@Override
86-
public void addTransformer(ClassTransformer classTransformer) {
87-
// just ignore it
88-
}
89-
};
90-
persistenceUnitInfo.setPersistenceUnitName("AotMetaModel");
75+
SpringPersistenceUnitInfo persistenceUnitInfo = new SpringPersistenceUnitInfo(
76+
managedTypes.getClass().getClassLoader());
77+
persistenceUnitInfo.setPersistenceUnitName("AotMetamodel");
78+
persistenceUnitInfo.setPersistenceUnitRootUrl(persistenceUnitRootUrl);
9179

9280
this.entityManagerFactory = init(() -> {
9381

9482
managedTypes.forEach(persistenceUnitInfo::addManagedClassName);
9583

9684
persistenceUnitInfo.setPersistenceProviderClassName(HibernatePersistenceProvider.class.getName());
97-
98-
return new PersistenceUnitInfoDescriptor(persistenceUnitInfo) {
99-
100-
@Override
101-
public List<String> getManagedClassNames() {
102-
return persistenceUnitInfo.getManagedClassNames();
103-
}
104-
105-
@Override
106-
public URL getPersistenceUnitRootUrl() {
107-
return persistenceUnitRootUrl != null ? persistenceUnitRootUrl : super.getPersistenceUnitRootUrl();
108-
}
109-
110-
};
85+
return new PersistenceUnitInfoDescriptor(persistenceUnitInfo.asStandardPersistenceUnitInfo());
11186
});
11287
}
11388

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/aot/JpaRepositoryContributor.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ protected void customizeConstructor(AotRepositoryConstructorBuilder constructorB
150150
});
151151
}
152152

153-
private String getEntityManagerFactoryRef() {
153+
private @Nullable String getEntityManagerFactoryRef() {
154154
return context.getConfigurationSource().getAttribute("entityManagerFactoryRef")
155155
.filter(it -> !"entityManagerFactory".equals(it)).orElse(null);
156156
}

spring-data-jpa/src/main/java/org/springframework/data/jpa/repository/query/QueryUtils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -834,7 +834,7 @@ static class FromExpressionFactory extends ExpressionFactorySupport {
834834
* @param <T> the type of the expression
835835
* @return the expression
836836
*/
837-
@SuppressWarnings("unchecked")
837+
@SuppressWarnings({ "unchecked", "NullAway" })
838838
<T> Expression<T> toExpressionRecursively(From<?, ?> from, PropertyPath property, boolean isForSelection,
839839
boolean hasRequiredOuterJoin) {
840840

spring-data-jpa/src/main/java/org/springframework/data/jpa/support/MergingPersistenceUnitManager.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,18 +18,18 @@
1818
import java.net.URISyntaxException;
1919
import java.net.URL;
2020

21-
import jakarta.persistence.spi.PersistenceUnitInfo;
22-
2321
import org.apache.commons.logging.Log;
2422
import org.apache.commons.logging.LogFactory;
2523
import org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager;
2624
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
25+
import org.springframework.util.StringUtils;
2726

2827
/**
2928
* Extends {@link DefaultPersistenceUnitManager} to merge configurations of one persistence unit residing in multiple
3029
* {@code persistence.xml} files into one. This is necessary to allow the declaration of entities in separate modules.
3130
*
3231
* @author Oliver Gierke
32+
* @author Christoph Strobl
3333
* @link https://github.com/spring-projects/spring-framework/issues/7287
3434
*/
3535
public class MergingPersistenceUnitManager extends DefaultPersistenceUnitManager {
@@ -42,10 +42,12 @@ protected void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui) {
4242
// Invoke normal post processing
4343
super.postProcessPersistenceUnitInfo(pui);
4444

45-
PersistenceUnitInfo oldPui = getPersistenceUnitInfo(((PersistenceUnitInfo) pui).getPersistenceUnitName());
45+
if (StringUtils.hasText(pui.getPersistenceUnitName())) {
46+
MutablePersistenceUnitInfo oldPui = getPersistenceUnitInfo(pui.getPersistenceUnitName());
4647

47-
if (oldPui != null) {
48-
postProcessPersistenceUnitInfo(pui, oldPui);
48+
if (oldPui != null) {
49+
postProcessPersistenceUnitInfo(pui, oldPui);
50+
}
4951
}
5052
}
5153

@@ -54,7 +56,7 @@ protected boolean isPersistenceUnitOverrideAllowed() {
5456
return true;
5557
}
5658

57-
void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, PersistenceUnitInfo oldPui) {
59+
void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, MutablePersistenceUnitInfo oldPui) {
5860

5961
String persistenceUnitName = pui.getPersistenceUnitName();
6062

@@ -82,7 +84,8 @@ void postProcessPersistenceUnitInfo(MutablePersistenceUnitInfo pui, PersistenceU
8284
if (!pui.getMappingFileNames().contains(mappingFileName)) {
8385

8486
if (LOG.isDebugEnabled()) {
85-
LOG.debug(String.format("Adding mapping file %s to persistence unit %s", mappingFileName, persistenceUnitName));
87+
LOG.debug(
88+
String.format("Adding mapping file %s to persistence unit %s", mappingFileName, persistenceUnitName));
8689
}
8790
pui.addMappingFileName(mappingFileName);
8891
}

spring-data-jpa/src/test/java/org/springframework/data/jpa/support/MergingPersistenceUnitManagerUnitTests.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646
@MockitoSettings(strictness = Strictness.LENIENT)
4747
class MergingPersistenceUnitManagerUnitTests {
4848

49-
@Mock PersistenceUnitInfo oldInfo;
49+
@Mock MutablePersistenceUnitInfo oldInfo;
5050

5151
@Mock MutablePersistenceUnitInfo newInfo;
5252

spring-data-jpa/src/test/java/org/springframework/data/jpa/util/TestMetaModel.java

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -21,18 +21,15 @@
2121
import jakarta.persistence.metamodel.EntityType;
2222
import jakarta.persistence.metamodel.ManagedType;
2323
import jakarta.persistence.metamodel.Metamodel;
24-
import jakarta.persistence.spi.ClassTransformer;
2524

26-
import java.util.List;
2725
import java.util.Map;
2826
import java.util.Set;
2927

3028
import org.hibernate.jpa.HibernatePersistenceProvider;
3129
import org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl;
3230
import org.hibernate.jpa.boot.internal.PersistenceUnitInfoDescriptor;
3331
import org.springframework.data.util.Lazy;
34-
import org.springframework.instrument.classloading.SimpleThrowawayClassLoader;
35-
import org.springframework.orm.jpa.persistenceunit.MutablePersistenceUnitInfo;
32+
import org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo;
3633

3734
/**
3835
* @author Christoph Strobl
@@ -97,28 +94,14 @@ public EntityManager entityManager() {
9794

9895
EntityManagerFactory init() {
9996

100-
MutablePersistenceUnitInfo persistenceUnitInfo = new MutablePersistenceUnitInfo() {
101-
@Override
102-
public ClassLoader getNewTempClassLoader() {
103-
return new SimpleThrowawayClassLoader(this.getClass().getClassLoader());
104-
}
105-
106-
@Override
107-
public void addTransformer(ClassTransformer classTransformer) {
108-
// just ingnore it
109-
}
110-
};
97+
SpringPersistenceUnitInfo persistenceUnitInfo = new SpringPersistenceUnitInfo(this.getClass().getClassLoader());
11198

11299
persistenceUnitInfo.setPersistenceUnitName(persistenceUnit);
113100
this.managedTypes.stream().map(Class::getName).forEach(persistenceUnitInfo::addManagedClassName);
114-
115101
persistenceUnitInfo.setPersistenceProviderClassName(HibernatePersistenceProvider.class.getName());
116102

117-
return new EntityManagerFactoryBuilderImpl(new PersistenceUnitInfoDescriptor(persistenceUnitInfo) {
118-
@Override
119-
public List<String> getManagedClassNames() {
120-
return persistenceUnitInfo.getManagedClassNames();
121-
}
122-
}, Map.of("hibernate.dialect", "org.hibernate.dialect.H2Dialect")).build();
103+
return new EntityManagerFactoryBuilderImpl(
104+
new PersistenceUnitInfoDescriptor(persistenceUnitInfo.asStandardPersistenceUnitInfo()) {},
105+
Map.of("hibernate.dialect", "org.hibernate.dialect.H2Dialect")).build();
123106
}
124107
}

0 commit comments

Comments
 (0)