En el
post anterior mencionamos los conceptos de One-To-many y Many-To-One y colocamos algunas entidades y programas de ejemplo que utilizaban el FetchType.EAGER.
En este post mostaré como configurar el entorno para que el LAZY funcione correctamente:
1) En primer lugar vamos a cambiar el fetchType en la clase "Customer1" :
2) Ahora ejecutamos el siguiente programa "main" que es el mismo del post anterior. Debería ejecutar un único Query sobre la tabla "tbcustomer":
Si nos fijamos en la consola, veremos que efectivamente se ejecuta un sólo query pero además sale un mensaje ... que NO es un error: {IndirectList: not instantiated}
El problema se origina en que dicho atributo es una colección de objetos y en la forma de cargalos. Como hemos definido que el objeto se carga de la forma LAZY, al referenciarlos hay un problema.
3) Para solucionar el tema, vamos a cambiar el código para leer la colección mediante un Iterator:
4) Sin embargo, podría ser que no funcione, entonces para asegurarnos, colocamos el javaagent con la ruta hacia el eclipselink.jar en las opciones de ejecución de la JVM: Click derecho al proyecto - Run As - Run Configuration y colocar la ruta donde está unicado el .jar:
Ahora sí debe funcionar la carga tipo LAZY.
Y si usas OpenJPA, el javaagent es openjpa-all-2.1.0.jar y el provider es org.apache.openjpa.persistence.PersistenceProviderImpl
Prueba y comenta este post.