Lazy property loading for hibernate is nice when you're using complex formulas for calculating values. But it requires bytecode instrumentation or otherwise hibernate will ignore 'lazy="true"' on property element and load the value eagerly. Here's the snippet of my pom.xml that does the instrumentation:
<build>
<plugins>
...
<!-- Bytecode insturmentation in order to enable lazy property loading by Hibernate. -->
<plugin>
<artifactId>maven-antrun-plugin</artifactId>
<version>1.3</version>
<executions>
<execution>
<id>Instrument domain classes</id>
<configuration>
<tasks>
<taskdef name="instrument" classname="org.hibernate.tool.instrument.javassist.InstrumentTask">
<classpath>
<path refid="maven.dependency.classpath" />
<path refid="maven.plugin.classpath" />
</classpath>
</taskdef>
<instrument verbose="true">
<fileset dir="${project.build.outputDirectory}">
<include name="com/example/domain/*.class" />
</fileset>
</instrument>
</tasks>
</configuration>
<phase>process-classes</phase>
<goals>
<goal>run</goal>
</goals>
</execution>
</executions>
<dependencies>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency><!-- bytecode instrumentation library to use... note that cglib is deprecated -->
<groupId>org.javassist</groupId>
<artifactId>javassist</artifactId>
<version>${javassist.version}</version>
</dependency>
<dependency><!-- so that slf4j won't barf about missing binding -->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>${slf4j.version} </version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
Note that you'll have to define the versions of libraries that you're using (here are my values):
<properties>
<hibernate.version>3.6.7.Final</hibernate.version>
<javassist.version>3.14.0-GA</javassist.version>
<slf4j.version>1.6.1</slf4j.version>
</properties>
No comments:
Post a Comment