Found it yesterday when reviewing my sample with Romain: I apparently did copy the following property over from another example: <property name="openjpa.InitializeEagerly" value="true"/> And this did lead to already trigger the class transformation while createEntityManagerFactory.
I did create a few samples, but did not manage to trigger any subsequent classloading at all. So no wonder in which case this could hit us yet. Before we introduce another expensive mechanism I would love to understand when the situation occurs at all. LieGrue, strub > Am 17.07.2020 um 12:03 schrieb Romain Manni-Bucau <rmannibu...@gmail.com>: > > Le ven. 17 juil. 2020 à 11:27, Mark Struberg <strub...@yahoo.de.invalid > <mailto:strub...@yahoo.de.invalid>> a > écrit : > >> answers inside. >> >> LieGrue, >> strub >> >>> Am 17.07.2020 um 11:14 schrieb Romain Manni-Bucau <rmannibu...@gmail.com >>> : >>> >>> Le ven. 17 juil. 2020 à 10:45, Mark Struberg <strub...@yahoo.de.invalid> >> a >>> écrit : >>> >>>> Both prepareUnenhancedClasses and loadAgent already run in >>>> createEntityManagerFactory. >>>> >>> >>> Not in general, depends the conf and by default i run in none of both >> with >>> a standard config for ex for EE. >> >> Let me rephrase this: both those methods will get called in >> createEntityManagerFactory already. If they actually perform some bytecode >> enhancement is up to configuration and whether the classes have been >> enhanced otherwise before ;) >> >> >>> >>> >>>> crateEntityManager does not trigger enhancement afaict. >>>> >>> >>> createEMF does not since the creation of openjpa is lazy so the first >>> createEM does (in general case one again). >> >> Nope, it really gets called already by createEntityManagerFactory. You can >> debug into this if you want. >> > > Did and I can guarantee you it is lazy if your conf does not enforce it > somehow. > > >> >> LieGrue, >> strub >> >> >>> >>>> >>>> LieGrue, >>>> strub >>>> >>>>> Am 17.07.2020 um 10:11 schrieb Romain Manni-Bucau < >> rmannibu...@gmail.com >>>>> : >>>>> >>>>> Hi Mark, >>>>> >>>>> If it helps: >>>>> >>>>> 1. org.apache.openjpa.kernel.AbstractBrokerFactory#postCreationCallback >>>>> only triggers the prepareUnenhancedClasses if preload=true (never the >>>> case >>>>> right? ;)) >>>>> 2. Normally classes are loaded in >>>>> there org.apache.openjpa.kernel.AbstractBrokerFactory#initializeBroker >>>>> *when creating an em, not an emf* so better to have loaded ran the >>>>> enhancement early (loadAgent) >>>>> 3. Not sure it is done but it can happen 2 has a custom MDR not >> returning >>>>> right the classes - seems code is ok with that. I don't know if it is a >>>>> case we want to handle, I don't think it is needed. >>>>> 4. There is another case you didn't list where the EMF can be there but >>>> no >>>>> EM and enhancement should happen ASAP: deserialization ;) >>>>> 5. Finally there is a subtle difference between SE and EE case where >> one >>>>> will trigger the agent and the other will just add the transformer in >> the >>>>> classloader through PersistenUnitInfo (and container should handle this >>>>> additional properly), I don't know if our agent should be compatible >> with >>>>> it for apploader (jvm one). >>>>> >>>>> Romain Manni-Bucau >>>>> @rmannibucau <https://twitter.com/rmannibucau> | Blog >>>>> <https://rmannibucau.metawerx.net/> | Old Blog >>>>> <http://rmannibucau.wordpress.com> | Github < >>>> https://github.com/rmannibucau> | >>>>> LinkedIn <https://www.linkedin.com/in/rmannibucau> | Book >>>>> < >>>> >> https://www.packtpub.com/application-development/java-ee-8-high-performance >>>>> >>>>> >>>>> >>>>> Le ven. 17 juil. 2020 à 09:35, Mark Struberg <strub...@yahoo.de.invalid >>> >>>> a >>>>> écrit : >>>>> >>>>>> 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