Weaving
A responsibility of all ORMs is lazy loading of related objects (so as not to load all the data in one go), and tracking of objects as they are modified (to flush back to the database).
With JPA, this is typically done dynamically at runtime, using a Java agent. The SimpleApp and HelloWorld starter apps demonstrate this. See below for further details on how to set this up.
Configuration
There are a number of EclipseLink configuration options to set or optionally to be set to enable weaving:
-
at a minimum, set eclipselink.weaving:
application.propertieseclipselink.weaving=true
-
in addition, optionally set the following (their default values are shown):
application.propertieseclipselink.weaving.changetracking=true eclipselink.weaving.eager=false eclipselink.weaving.fetchgroups=true eclipselink.weaving.internal=true eclipselink.weaving.lazy=true
These all default to
true
except for eclipselink.weaving.eager, which you should only enable if you fully understand its consequences.
The weaving process modifies the classes themselves, introducing additional public
methods.
Depending upon the value of isis.core.meta-model.introspector.policy configuration property, these could be picked up as part of the framework’s metamodel, which is not what you want.
Therefore, to use JPA, you will also need to change this configuration property, either:
-
to IntrospectionPolicy.ANNOTATION_REQUIRED
application.propertiesisis.core.meta-model.introspector.policy=annotation_required
or,
-
to IntrospectionPolicy.ENCAPSULATION_ENABLED
application.propertiesisis.core.meta-model.introspector.policy=encapsulation_enabled
The SimpleApp and HelloWorld starter apps both use the latter option.
Runtime
As well as setting the above configuration options, it’s also neceesary to run the application with the spring-instrument.jar
Java agent, which actually performs the weaving at load-time.
-
Download this jar file using:
mvn dependency:get -DgroupId=org.springframework -DartifactId=spring-instrument -Dversion=XXX
= changing "XXX" to the value that
${spring-framework.version}
resolves to, from the Isis parentpom.xml
. -
Move and rename this file, eg to
lib/spring-instrument.jar
. -
Run the application using:
-javaagent:lib/spring-instrument.jar
as a JVM option.