2012-01-05 14 views
5

私の友人は、オープンソースソフトウェアOscarMcmasterに特有の問題があります。彼は私に助けてくれるよう頼んだし、問題を引き起こすコードに行くことができた。実行さBillingServiceDaoクラス次のコードにorg.hibernate.HibernateException:コレクションが任意のセッションに関連付けられていない

private static BillingServiceDao billingServiceDao = 
        (BillingServiceDao) SpringUtils.getBean("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();であるが、私は」

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コンテナによって初期化され、次の方法であります他の宇宙(.Net)からのmであり、問​​題の救済策を知らない。

私の友人がこの問題を解決できるように助けてください。

EDIT: - デフォルトではスタックトレース

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

、Hibernateは "怠惰" リストオブジェクトを移入し、あなたが開いているセッションを必要とすることができません。 Springは、DAO呼び出しの回りにHibernateセッションを開始したり閉じたりしています。そのため、リストを調べると、Hibernateはそれを設定しようとしますが、セッションが閉じられてエラーがスローされていることがわかります。

あなたは、web.xml(あなたがウェブアプリを書いていると仮定)、春のコンテキストにOpenSessionInViewInterceptorを追加、または単にそれらを返す前に、リストの内容を抽出するOpenSessionInViewFilterを追加する必要があります。

return new ArrayList<BillingService>(list); 

これ以外にも、次のようになります。

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

最初にSpringを使用する目的を完全に無効にします。

+0

私はこれをテストします。しかし、2番目のもの( '(BillingServiceDao)SpringUtils.getBean(" billingServiceDao "); ')は私を超えています:D – TheVillageIdiot

+0

まだ、同じ例外が発生しています。私は質問にスタックトレースを追加しました。 – TheVillageIdiot

+1

その後、DAOレベルで開かれたセッションはありません。 OpenSessionInViewパターンを実装する必要があります(上記のNandkumarのリンクを参照)。 – bernerbrau

0

@Transactionalというサービスのメソッドに注釈付けできなかったため、この問題が発生しました。呼び出し元に適切な注釈が付けられていない限り、別のメソッドへの呼び出しが(同じクラス内であっても)呼び出されたとき、Hibernateはセッションを閉じているようです。