Hi lords and ladies! I'm right now in the process of moving openjpa to jakarta natively. While doing that I stumbled across a failing test (org.apache.openjpa.persistence.detach.TestDetachNoProxy#testClear10Compat) which is due to some proxy classes cannot be generated at build time.
I'm looking at the generated classes right now and I have to admit I'm a bit confused. It looks like they contain state? (via StateManager and delegating to super which is java.sql.Date) public class java$sql$Date$proxy extends Date implements ProxyDate { private transient OpenJPAStateManager sm; private transient int field; public java$sql$Date$proxy(long var1) { super(var1); } public java$sql$Date$proxy(int var1, int var2, int var3) { super(var1, var2, var3); } public void setOwner(OpenJPAStateManager var1, int var2) { this.sm = var1; this.field = var2; } public void setDate(int var1) { Proxies.dirty(this, true); super.setDate(var1); } public void setMonth(int var1) { Proxies.dirty(this, true); super.setMonth(var1); } But on the other hand we do cache those instances in ProxyManagerImpl private ProxyDate getFactoryProxyDate(Class type) { // we don't lock here; ok if two proxies get generated for same type ProxyDate proxy = (ProxyDate) _proxies.get(type); if (proxy == null) { ClassLoader l = GeneratedClasses.getMostDerivedLoader(type, ProxyDate.class); Class pcls = loadBuildTimeProxy(type, l); if (pcls == null) pcls = GeneratedClasses.loadBCClass( generateProxyDateBytecode(type, true), l); proxy = (ProxyDate) instantiateProxy(pcls, null, null); _proxies.put(type, proxy); } return proxy; } and others. It looks really weird, because this caches instances apparently? Reason why I do look at it is that with moving to Jakarta and Java11 the Serp stuff totally falls apart. And the ProxyManagerImpl#main which is called via Ant during the build to create a few proxies named java$sql$... in o.a.openjpa.util fails due to that. And the build time proxies are serializable, while the dynamically built are NOT, because they are loaded via a separate synthetical BCClassLoader from Serp. Which is not available or gets ignored during deserialisation. Now we have org.apache.openjpa.persistence.detach.TestDetachNoProxy#testClear10Compat fail due to that if those proxy classes cannot be generated at build time. But likely this problem also appears in other cases where this mechanism is used. Which is _not_ really often the case afaict. Usually when enhancing the class the whole getter and setters are changed during enhancement to call StateManager#dirty. Still it's imo important to fix the whole proxy generation. Is anywhere around which has a spare hour (or a few) to help me look at this via a shared screen session? I fear this is not as easy as it looks like. I'd first like to understand what this really is used for nowadays and only then replace it with an ASM based approach. Writing the ASM stuff is actually not the real problem here. Anyone up for a hacking session? txs and LieGrue, strub