Para poder inicializar atributos de manera lazy con Hibernate, debemos permitir el byte code enhancement, añadiendo el siguiente plugin a nuestropom.xml:
<plugin>
<groupId>org.hibernate.orm.tooling</groupId>
<artifactId>hibernate-enhance-maven-plugin</artifactId>
<version>${hibernate.version}</version>
<executions>
<execution>
<configuration>
<failOnError>true</failOnError>
<enableLazyInitialization>true</enableLazyInitialization>
<enableDirtyTracking>true</enableDirtyTracking>
<enableAssociationManagement>true</enableAssociationManagement>
<enableExtendedEnhancement>false</enableExtendedEnhancement>
</configuration>
<goals>
<goal>enhance</goal>
</goals>
</execution>
</executions>
</plugin>
Además, en application.properties hay que añadir la siguiente línea:
spring.jpa.properties.hibernate.enable_lazy_load_no_trans=true
Esta línea nos permite obtener propiedades lazy sin necesidad de mantener la sesión.
Por último, en cada getter que queramos que tenga inicialización lazy tendremos que añadir la etiqueta@Basic(fetch = FetchType.LAZY). Esto hará que cuando pidamos un objeto, éste se devuelva por defecto sin cargar el valor para ese campo. Una vez se llame al getter, se pedirá a base de datos su valor.
@Column(name = "CHK_ERRORES", nullable = true, length = 4000)
@JsonView(Views.Detalle.class)
@Basic(fetch = FetchType.LAZY)
public String getChkErrores() {
return this.chkErrores;
}
Como lo habitual es que hagamos las peticiones a base de datos para devolver un JSON con la información, por defecto se intentarán mandar todos los campos del objeto, dando un error. Para seleccionar qué incluir en el JSON, podemos usar las vistas (se explican aquí).
Esto puede ser útil, por ejemplo, en una tabla que se muestren los datos básicos, y al desplegar una fila se muestre un contenido más complejo, que el tamaño que se tenga que transferir sea medianamente grande. Podemos poner el contenido como lazy, de forma que los datos básicos se carguen rápidamente, y al desplegar se haga otra petición para cargar el contenido.