no, didn't work. LieGrue, strub
> Am 18.07.2020 um 18:00 schrieb Romain Manni-Bucau <rmannibu...@gmail.com>: > > Not sure I got the question but I suspect the case can be reproduced with a > plain new MyEntity() before your Persistence.createEMF. > > 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 sam. 18 juil. 2020 à 17:57, Mark Struberg <strub...@yahoo.de.invalid> a > écrit : > >> 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 >> >>