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

Reply via email to