2012-01-05 28 views
5

Một người bạn của tôi đã gặp sự cố đặc biệt trong phần mềm nguồn mở OscarMcmaster. Anh ấy yêu cầu tôi giúp đỡ và tôi có thể nhận được mã gây ra vấn đề. Sau đây là một phương pháp:org.hibernate.HibernateException: bộ sưu tập không được liên kết với bất kỳ phiên nào

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

các billingServiceDao được khởi tạo bởi Spring container:

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

Trong BillingServiceDao lớp mã sau đây được thực hiện:

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

Thủ phạm chính là query.getResultList(); nhưng tôi m từ vũ trụ khác (.Net) và không biết biện pháp khắc phục cho vấn đề.

Hãy giúp tôi giúp bạn tôi giải quyết vấn đề này.

EDIT: - Stack Trace

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

Liên kết này có thể giúp bạn: http://stackoverflow.com/questions/8292820/org-hibernate-lazyinitialization-exception –

Trả lời

4

Theo mặc định, Hibernate phổ biến danh sách các đối tượng "lười biếng", và để làm điều đó bạn cần một phiên mở. Mùa xuân đang mở và đóng phiên Hibernate xung quanh cuộc gọi đến DAO. Vì vậy, khi bạn đi đến kiểm tra danh sách, Hibernate cố gắng để cư nó cho bạn, nhưng nó thấy rằng phiên được đóng lại và ném lỗi.

Bạn cần phải thêm một OpenSessionInViewFilter vào web.xml (giả sử bạn đang viết một ứng dụng web), thêm một OpenSessionInViewInterceptor với bối cảnh mùa xuân, hoặc đơn giản là trích xuất nội dung danh sách trước khi trở về họ:

return new ArrayList<BillingService>(list); 

Ngoài ra như một sang một bên, điều này:

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

Hoàn toàn đánh bại mục đích sử dụng Spring ngay từ đầu.

+0

cảm ơn thân yêu Tôi sẽ kiểm tra điều này (trích xuất danh sách trước khi gửi lại). Nhưng điều thứ hai ('(BillingServiceDao) SpringUtils.getBean (" billingServiceDao "); ') là vượt ra ngoài tôi: D – TheVillageIdiot

+0

nope, vẫn nhận được ngoại lệ tương tự. Tôi đã thêm dấu vết ngăn xếp cũng trong câu hỏi. – TheVillageIdiot

+1

Sau đó, bạn không có phiên được mở ở cấp DAO. Bạn cần triển khai thực hiện mẫu OpenSessionInView (xem ở trên liên kết từ Nandkumar). – bernerbrau

0

Tôi đã gặp sự cố này vì tôi không thể ghi chú phương thức trong dịch vụ với @Transactional. Dường như Hibernate đóng phiên khi một cuộc gọi đến phương thức khác được thực hiện (ngay cả trong cùng một lớp) trừ khi người gọi được chú thích một cách thích hợp.

Các vấn đề liên quan