, P extends PersistentProperty> T createInstance(E entity,
ParameterValueProvider
provider) {
+ EntityInstantiator instantiator = getEntityInstantiator(entity);
+ return instantiator.createInstance(entity, provider);
+ }
+
+ private , P extends PersistentProperty> EntityInstantiator getEntityInstantiator(
+ E entity) {
+
EntityInstantiator instantiator = this.entityInstantiators.get(entity.getTypeInformation());
if (instantiator == null) {
instantiator = potentiallyCreateAndRegisterEntityInstantiator(entity);
}
- return instantiator.createInstance(entity, provider);
+ return instantiator;
}
/**
@@ -170,10 +182,19 @@ protected EntityInstantiator doCreateEntityInstantiator(PersistentEntity, ?> e
*/
boolean shouldUseReflectionEntityInstantiator(PersistentEntity, ?> entity) {
+ String accessorClassName = ObjectInstantiatorClassGenerator.generateClassName(entity);
+
+ // already present in classloader
+ if (ClassUtils.isPresent(accessorClassName, entity.getType().getClassLoader())) {
+ return false;
+ }
+
if (NativeDetector.inNativeImage()) {
if (LOGGER.isDebugEnabled()) {
- LOGGER.debug(String.format("graalvm.nativeimage - fall back to reflection for %s", entity.getName()));
+ LOGGER.debug(String.format(
+ "[org.graalvm.nativeimage.imagecode=true] and no AOT-generated EntityInstantiator for %s. Falling back to reflection.",
+ entity.getName()));
}
return true;
@@ -388,7 +409,7 @@ public , P extends PersistentPrope
static class ObjectInstantiatorClassGenerator {
private static final String INIT = "";
- private static final String TAG = "_Instantiator_";
+ private static final String TAG = "__Instantiator_";
private static final String JAVA_LANG_OBJECT = Type.getInternalName(Object.class);
private static final String CREATE_METHOD_NAME = "newInstance";
@@ -431,8 +452,8 @@ public Class> generateCustomInstantiatorClass(PersistentEntity, ?> entity,
* @param entity
* @return
*/
- private String generateClassName(PersistentEntity, ?> entity) {
- return entity.getType().getName() + TAG + Integer.toString(entity.hashCode(), 36);
+ static String generateClassName(PersistentEntity, ?> entity) {
+ return entity.getType().getName() + TAG + Integer.toString(Math.abs(entity.getType().getName().hashCode()), 36);
}
/**
diff --git a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java
index 0e6047d7aa..8c874d47f4 100644
--- a/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java
+++ b/src/main/java/org/springframework/data/mapping/model/ClassGeneratingPropertyAccessorFactory.java
@@ -76,7 +76,8 @@
* @author Johannes Englmeier
* @since 1.13
*/
-public class ClassGeneratingPropertyAccessorFactory implements PersistentPropertyAccessorFactory {
+public class ClassGeneratingPropertyAccessorFactory
+ implements PersistentPropertyAccessorFactory, PersistentEntityClassInitializer {
// Pooling of parameter arrays to prevent excessive object allocation.
private final ThreadLocal