2012-01-05 17 views
5

से जुड़ा नहीं है मेरे एक दोस्त को ओपन सोर्स सॉफ्टवेयर OscarMcmaster में एक अनोखी समस्या मिली है। उसने मुझे मदद करने के लिए कहा और मैं समस्या के कारण कोड प्राप्त करने में सक्षम हूं।org.hibernate.HibernateException: संग्रह किसी भी सत्र

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

billingServiceDaoSpring कंटेनर से आरंभ नहीं हो जाता:

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

BillingServiceDao में वर्ग निम्न कोड निष्पादित:

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; 
} 

अपराधी query.getResultList(); है, लेकिन मैं निम्नलिखित एक विधि है अन्य ब्रह्मांड से (नेट) और समस्या के लिए उपाय नहीं पता।

कृपया मेरी समस्या को हल करने में मेरी मदद करें।

संपादित करें: - स्टैक ट्रेस

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

इस लिंक से आपको मदद मिल सकती है: http://stackoverflow.com/questions/8292820/org-hibernate-lazyinitialization-exception –

उत्तर

4

डिफ़ॉल्ट रूप से, हाइबरनेट सूची वस्तुओं "lazily", और है कि आप एक खुला सत्र की जरूरत है ऐसा करने के लिए भरता है। वसंत डीएओ को कॉल के आसपास हाइबरनेट सत्र खोल रहा है और बंद कर रहा है। तो जब आप सूची का निरीक्षण करने के लिए जाते हैं, तो हाइबरनेट इसे आपके लिए पॉप्युलेट करने का प्रयास करता है, लेकिन यह पाया जाता है कि सत्र बंद है और त्रुटि फेंकता है।

आप web.xml (यह मानते हुए कि आप एक वेब अनुप्रयोग लिख रहे हैं), वसंत संदर्भ के लिए एक OpenSessionInViewInterceptor जोड़ने के लिए, या बस उन्हें लौटने से पहले सूची सामग्री को निकालने के लिए एक OpenSessionInViewFilter जोड़ने की जरूरत:

return new ArrayList<BillingService>(list); 

इसके अलावा, एक तरफ, यह:

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

पूरी तरह से वसंत का उपयोग करने के उद्देश्य को पूरी तरह से हरा देता है।

+0

धन्यवाद प्रिय मैं इस (इसे वापस भेजने से पहले निकालने सूची) का परीक्षण होगा। लेकिन दूसरी बात ('(बिलिंग सेवा सेवा) SpringUtils.getBean (" बिलिंग सेवा सेवा "); ') मेरे बाहर है: डी – TheVillageIdiot

+0

नहीं, अभी भी एक ही अपवाद हो रहा है। मैंने सवाल में स्टैक ट्रेस भी जोड़ा है। – TheVillageIdiot

+1

फिर आपके पास डीएओ स्तर पर एक सत्र नहीं खोला गया है। आपको OpenSessionInView पैटर्न को लागू करने की आवश्यकता है (नंदकुमार से ऊपर लिंक देखें)। – bernerbrau

0

मुझे यह समस्या दिखाई दे रही थी क्योंकि मैं @Transactional के साथ किसी सेवा में एक विधि को एनोटेट करने में विफल रहा था। ऐसा लगता है कि जब भी कॉलर उचित रूप से एनोटेट किया जाता है तब तक हाइबरनेट सत्र को बंद कर देता है जब किसी अन्य विधि को कॉल किया जाता है (यहां तक ​​कि उसी कक्षा में भी)।

संबंधित मुद्दे