martes, 1 de septiembre de 2009

Problemas con FetchType.LAZY en EJB 3.0

Error:

Exception Description: An attempt was made to traverse a relationship using indirection that had a null Session. This often occurs when an entity with an uninstantiated LAZY relationship is serialized and that lazy relationship is traversed after serialization. To avoid this issue, instantiate the LAZY relationship prior to serialization.

Problema:

Cuando se tiene un maestro-detalle en EJB 3.0 se crea una entidad con una lista de objetos de la entidad hija, normalmente en la lista hija se usa FetchType.LAZY para el administrador de los datos.
Cuando se consulta un registro de la tabla padre, el administrador de JPA en la lista de entidades hijas la trae vacia y cuando se trata de usar genera el error.



Solución:


Cuando se realice la consulta del entity, se debe tratar de sacar el tamaño de la lista y asi se obliga a LAZY consultar y llenar las listas.
Ej:
Linea de codigo en el backing bean


this.lista = service.queryFindId(id);

lineas de codigo en el servicio

public lista queryFindId(String id) {       
Entity entity = em.find(Entity.class, id);
if (entity != null) {
entity.getCollection1().size();
entity.getCollection2().size();
entity.getCollection3().size();
entity.getCollection4().size();
}
return entity;
}

6 comentarios:

  1. Con Seam, podemos cargar los objetos y listas mapeadas con Lazy automaticamente.

    ResponderEliminar
  2. Si un entity tiene 5 listas hijas, el sube automaticamente todas las 5? o se le puede indicar que suba solo 3 de las 5?

    Que pasa con el consumo de recursos?

    ResponderEliminar
  3. Las sube a medida q las vas utilizando, si existe una disminucion en el desempeño pues coloca una capa mas sobre JEE, pero esta debe ser analizada ( costo-beneficio ) en el contexto donde se este utilizando la aplicacion.

    ResponderEliminar
  4. Listo muchas gracias por la aclaración.

    Lo invito a participar del blog publicando tutoriales o casos que tenga resueltos para compartirlos.

    ResponderEliminar
  5. perdon la ignorancia el id q aparece ahi a q hace referencia

    ResponderEliminar
  6. Edwing el id en la linea this.lista = service.queryFindId(id); es el parametro que se debe coloca en el método para hacer la consulta, osea el valor de la llave primaria para le registro que se desea buscar

    ResponderEliminar