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.properties
    eclipselink.weaving=true
  • in addition, optionally set the following (their default values are shown):

    application.properties
    eclipselink.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:

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 parent pom.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.