The lazy attribute for property tag in hibernate allows to lazily load the property as per the link: http://docs.jboss.org/hibernate/orm/3.3/reference/en-US/html/mapping.html#mapping-declaration-property
lazy (optional - defaults to false): specifies that this property should be fetched lazily when the instance variable is first accessed. It requires build-time bytecode instrumentation.
But when I tried to set lazy=true for one of my property it is not loading it lazily in this example:
Hibernate Mapping file:
<hibernate-mapping package="org.hibernate.tutorial.domain">
<class name="Event" table="EVENTS" select-before-update="true">
<id name="id" column="EVENT_ID">
<generator class="native" />
</id>
<property name="date" type="timestamp" column="EVENT_DATE" />
<property name="title" lazy="true"/>
<set name="participants" table="PERSON_EVENT" inverse="true">
<key column="EVENT_ID" />
<many-to-many column="PERSON_ID" class="Person" />
</set>
</class>
</hibernate-mapping>
Program:
public static void main(String[] args) {
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
Event event = (Event) session.get(Event.class, 135L);
session.getTransaction().commit();
System.out.println(event);
HibernateUtil.getSessionFactory().close();
}
Query generated by hibernate:
Hibernate: select event0_.EVENT_ID as EVENT1_0_0_, event0_.EVENT_DATE as EVENT2_0_0_, event0_.title as title0_0_ from EVENTS event0_ where event0_.EVENT_ID=?
Please help me in understanding why the lazy is not working in this case?
With Hibernate 5, this can be done easily using bytecode enhancement.
First, you need to add the following Maven plugin:
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<enableLazyInitialization>true</enableLazyInitialization>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
Then, you can simply annotate your entity properties with @Basic(fetch = FetchType.LAZY)
:
@Entity(name = "Event")
@Table(name = "event")
public class Event extends BaseEntity {
@Type(type = "jsonb")
@Column(columnDefinition = "jsonb")
@Basic(fetch = FetchType.LAZY)
private Location location;
public Location getLocation() {
return location;
}
public void setLocation(Location location) {
this.location = location;
}
}
When you fetch the entity:
Event event = entityManager.find(Event.class,
eventHolder.get().getId());
LOGGER.debug("Fetched event");
assertEquals("Cluj-Napoca", event.getLocation().getCity());
Hibernate is going to load the lazy property using a secondary select:
SELECT e.id AS id1_0_0_
FROM event e
WHERE e.id = 1
-- Fetched event
SELECT e.location AS location2_0_
FROM event e
WHERE e.id = 1
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With