diff --git a/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java b/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java
index a2c1dbfce1c..277a2810ee2 100644
--- a/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java
+++ b/spring-orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java
@@ -24,11 +24,14 @@ import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashSet;
+import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
+import javax.persistence.ParameterMode;
import javax.persistence.Query;
+import javax.persistence.StoredProcedureQuery;
import javax.persistence.TransactionRequiredException;
import org.apache.commons.logging.Log;
@@ -339,17 +342,23 @@ public abstract class SharedEntityManagerCreator {
/**
* Invocation handler that handles deferred Query objects created by
* non-transactional createQuery invocations on a shared EntityManager.
+ *
Includes deferred output parameter access for JPA 2.1 StoredProcedureQuery,
+ * retrieving the corresponding values for all registered parameters on query
+ * termination and returning the locally cached values for subsequent access.
*/
private static class DeferredQueryInvocationHandler implements InvocationHandler {
private final Query target;
@Nullable
- private EntityManager em;
+ private EntityManager entityManager;
- public DeferredQueryInvocationHandler(Query target, EntityManager em) {
+ @Nullable
+ private Map