hi folks! I'm right now cleaning up old code in our enhancer. Like removing java5 hacks, etc This is also triggered by our recent discussion about _transform and other pieces. Slowly getting my head into the right space for it. This is way more complex than I remembered ;)
So here is my next puzzle: I've created a new example with 2 classes: Person and Employee extends Person Plus a persistence.xml with enlisting those 2 classes (makes a difference!) and essentially <property name="openjpa.DynamicEnhancementAgent" value="true"/> <property name="openjpa.RuntimeUnenhancedClasses" value="supported"/> The reason I switched on RuntimeUnenhancedClasses is that this check is performed when the BrokerFactory gets created. And if the classes are not build-time enhanced, then it fails in org.apache.openjpa.enhance.ManagedClassSubclasser#prepareUnenhancedClasses if (conf.getRuntimeUnenhancedClassesConstant() != RuntimeUnenhancedClassesModes.SUPPORTED) { .. And if you switch to supported, then it will create a new subclass and replaces field access to the getters/setters. Sadly java.lang.instrument.Instrumentation#retransform cannot be used to add new fields or methods. Otherwise we could do a direct full replacement of this class. Fun thing is that later on in org.apache.openjpa.persistence.PersistenceProviderImpl#createEntityManagerFactory(java.lang.String, java.lang.String, java.util.Map) we call loadAgent(factory); But what is it supposed to do? Which cases does it serve? If the classes did not have been already enhanced at build time nor via javaagent they will now be subclassed by ManagedClassSubclasser. And if we do not set RuntimeUnenhancedClasses=supported then we will never make it so far but blow up way earlier. Also: it is nice to have that agent attached. But why? All the entity classe already have been loaded already during BrokerFactory startup. There is no more entity class left over which needs enhancement, isn't? This is the log I get which reflects what I mean. Happy to share the code in a playground branch. 1261 test-classtransform INFO [main] openjpa.Enhance - Creating subclass and redefining methods for "[class org.apache.openjpa.examples.dynenhance.Employee, class org.apache.openjpa.examples.dynenhance.Person]". This means that your application will be less efficient than it would if you ran the OpenJPA enhancer. 1412 test-classtransform INFO [main] openjpa.Runtime - OpenJPA dynamically loaded the class enhancer. Any classes that were not enhanced at build time will be enhanced when they are loaded by the JVM. LieGrue, strub