gpt4 book ai didi

java - 组织.hibernate.HibernateException : collection is not associated with any session

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:22:47 25 4
gpt4 key购买 nike

我的一个 friend 在开源软件 OscarMcmaster 中遇到了一个特殊问题。他让我帮忙,我能够找到导致问题的代码。下面是一个方法:

 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(); 但我来自其他宇宙 (.Net),不知道该问题的补救措施。

请帮我帮我的 friend 解决这个问题。

编辑:- 堆栈跟踪

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)

最佳答案

默认情况下,Hibernate 会“延迟”填充列表对象,为此您需要一个打开的 session 。 Spring 围绕对 DAO 的调用打开和关闭 Hibernate session 。因此,当您去检查列表时,Hibernate 会尝试为您填充它,但它发现 session 已关闭并抛出错误。

您需要将 OpenSessionInViewFilter 添加到 web.xml(假设您正在编写 Web 应用程序),将 OpenSessionInViewInterceptor 添加到 spring 上下文,或者在返回列表内容之前简单地提取它们:

return new ArrayList<BillingService>(list);

顺便说一句,这个:

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

完全违背了使用 Spring 的初衷。

关于java - 组织.hibernate.HibernateException : collection is not associated with any session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8747712/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com