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:
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.
Ya que Homero me pide que comente lo hago, profesor esto tambien vendrá en el examen parcial del martes? .... Victor Aguirre
ResponderEliminarHola
ResponderEliminarNop ... este tema es un "Bonus pack" ... No viene.
Es mas , lo que viene esta por ahi cifrado dentro de las PPT's y ejemplos de clase.
Nos vemos