diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java index 46dd61687301044389b54deace51ea37d7277a59..f2ea9d67a222c271c08eb1d39fdcb7799ed9cbf4 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/SharedEntityManagerCreator.java @@ -71,7 +71,7 @@ public abstract class SharedEntityManagerCreator { * @return a shareable transaction EntityManager proxy */ public static EntityManager createSharedEntityManager(EntityManagerFactory emf, Map properties) { - Class[] emIfcs = null; + Class[] emIfcs; if (emf instanceof EntityManagerFactoryInfo) { EntityManagerFactoryInfo emfInfo = (EntityManagerFactoryInfo) emf; Class emIfc = emfInfo.getEntityManagerInterface(); @@ -154,10 +154,10 @@ public abstract class SharedEntityManagerCreator { // JPA 2.0: return EntityManagerFactory without creating an EntityManager. return this.targetFactory; } - else if (method.getName().equals("getQueryBuilder")) { - // JPA 2.0: return EntityManagerFactory's QueryBuilder (avoid creation of EntityManager). + else if (method.getName().equals("getQueryBuilder") || method.getName().equals("getMetamodel")) { + // JPA 2.0: return EntityManagerFactory's QueryBuilder/Metamodel (avoid creation of EntityManager) try { - return EntityManagerFactory.class.getMethod("getQueryBuilder").invoke(this.targetFactory); + return EntityManagerFactory.class.getMethod(method.getName()).invoke(this.targetFactory); } catch (InvocationTargetException ex) { throw ex.getTargetException(); @@ -202,15 +202,11 @@ public abstract class SharedEntityManagerCreator { return target; } else if (method.getName().equals("unwrap")) { - // Handle JPA 2.0 unwrap method - could be a proxy match. - Class targetClass = (Class) args[0]; - if (targetClass == null || targetClass.isInstance(proxy)) { - return proxy; - } // We need a transactional target now. if (target == null) { throw new IllegalStateException("No transactional EntityManager available"); } + // Still perform unwrap call on target EntityManager. } // Regular EntityManager operations.