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. > 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). > > 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 > >> > >> > >