diff --git a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java index b845ce38e47..3ad320713ac 100644 --- a/org.springframework.orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java +++ b/org.springframework.orm/src/main/java/org/springframework/orm/jpa/persistenceunit/DefaultPersistenceUnitManager.java @@ -336,8 +336,17 @@ public class DefaultPersistenceUnitManager * @param persistenceUnitName the name of the desired persistence unit * @return the PersistenceUnitInfo in mutable form, or null if not available */ - protected final PersistenceUnitInfo getPersistenceUnitInfo(String persistenceUnitName) { - return this.persistenceUnitInfos.get(persistenceUnitName); + protected final MutablePersistenceUnitInfo getPersistenceUnitInfo(String persistenceUnitName) { + PersistenceUnitInfo pui = this.persistenceUnitInfos.get(persistenceUnitName); + if (Proxy.isProxyClass(pui.getClass())) { + // JPA 2.0 PersistenceUnitInfo decorator with a SpringPersistenceUnitInfo as target + Jpa2PersistenceUnitInfoDecorator dec = (Jpa2PersistenceUnitInfoDecorator) Proxy.getInvocationHandler(pui); + return dec.getTarget(); + } + else { + // Must be a raw JPA 1.0 SpringPersistenceUnitInfo instance + return (MutablePersistenceUnitInfo) pui; + } } /** @@ -420,6 +429,10 @@ public class DefaultPersistenceUnitManager } } + public final SpringPersistenceUnitInfo getTarget() { + return this.target; + } + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("getSharedCacheMode")) { return Enum.valueOf(this.sharedCacheModeEnum, this.target.getSharedCacheModeName());