2012-01-05 21 views
5

Un amigo mío tiene un problema peculiar en un software de código abierto OscarMcmaster. Me pidió ayuda y puedo acceder al código que causa el problema. El siguiente es un método:org.hibernate.HibernateException: la colección no está asociada a ninguna sesión

public BillingService getBillingCodeByCode(String code){ 
    List list = billingServiceDao.findBillingCodesByCode(code,"BC"); 
    if(list == null || list.size() ==0){ 
     return null; 
    } 
    return (BillingService) list.get(0); 
    } 

El billingServiceDao es inicializado por Spring contenedor:

private static BillingServiceDao billingServiceDao = 
        (BillingServiceDao) SpringUtils.getBean("billingServiceDao"); 

En BillingServiceDao se ejecuta clase siguiente código:

public List<BillingService> findBillingCodesByCode(String code, String region) { 
    Query query = entityManager.createQuery("select bs from...."); 
    query.setParameter("code", code + "%"); 
    query.setParameter("region", region); 

    @SuppressWarnings("unchecked") 
    List<BillingService> list = query.getResultList(); 
    return list; 
} 

El culpable es query.getResultList(); pero me m del otro universo (.Net) y no conoce el remedio para el problema.

Por favor, ayúdame a ayudar a mi amigo a resolver este problema.

EDIT: - Seguimiento de la pila

SEVERE: Servlet.service() for servlet action threw exception 
org.hibernate.HibernateException: collection is not associated with any session 
    at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:449) 
    at org.hibernate.engine.StatefulPersistenceContext.initializeNonLazyCollections(StatefulPersistenceContext.java:797) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:241) 
    at org.hibernate.loader.Loader.doList(Loader.java:2220) 
    at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2104) 
    at org.hibernate.loader.Loader.list(Loader.java:2099) 
    at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:378) 
    at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:338) 
    at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:172) 
    at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1121) 
    at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79) 
    at org.hibernate.ejb.QueryImpl.getResultList(QueryImpl.java:66) 
    at org.oscarehr.common.dao.BillingServiceDao.findBillingCodesByCode(BillingServiceDao.java:47) 
    at org.oscarehr.common.dao.BillingServiceDao$$FastClassByCGLIB$$f613fb7e.invoke(<generated>) 
    at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:191) 
+0

Este enlace puede ayudarlo: http://stackoverflow.com/questions/8292820/org-hibernate-lazyinitialization-exception –

Respuesta

4

Por defecto, Hibernate rellena la lista de objetos "perezosa", y para ello se necesita una sesión abierta. Spring abre y cierra la sesión de Hibernate en torno a la llamada al DAO. Entonces, cuando va a inspeccionar la lista, Hibernate intenta rellenarla por usted, pero encuentra que la sesión está cerrada y arroja el error.

es necesario agregar un OpenSessionInViewFilter al web.xml (suponiendo que está escribiendo una aplicación web), añadir una OpenSessionInViewInterceptor al contexto primavera, o simplemente extraer el contenido de la lista antes de devolverlos:

return new ArrayList<BillingService>(list); 

También como un lado, esto:

private static BillingServiceDao billingServiceDao = 
       (BillingServiceDao) SpringUtils.getBean("billingServiceDao"); 

Niega por completo el propósito de usar Spring en primer lugar.

+0

gracias querido probaré esto (extraer la lista antes de devolverla). Pero la segunda cosa ('(BillingServiceDao) SpringUtils.getBean (" billingServiceDao "); ') está más allá de mí: D – TheVillageIdiot

+0

no, aún obteniendo la misma excepción. He agregado el rastro de la pila también en la pregunta. – TheVillageIdiot

+1

Entonces no tiene una sesión abierta en el nivel DAO. Debe implementar el patrón OpenSessionInView (consulte el enlace anterior de Nandkumar). – bernerbrau

0

Estaba viendo este problema porque no pude anotar un método en un servicio con @Transactional. Parece que Hibernate cierra la sesión cuando se realiza una llamada a otro método (incluso dentro de la misma clase) a menos que la persona que llama esté anotada apropiadamente.

Cuestiones relacionadas