Java org.hibernate.HibernateException:集合未与任何会话关联

Java org.hibernate.HibernateException:集合未与任何会话关联,java,hibernate,spring,Java,Hibernate,Spring,我的一个朋友在一个开源软件中遇到了一个特殊的问题。他请我帮忙,我能够找到导致问题的代码。以下是一种方法: public BillingService getBillingCodeByCode(String code){ List list = billingServiceDao.findBillingCodesByCode( code,"BC"); if(list == null || list.size() ==0 ){ return null; }

我的一个朋友在一个开源软件中遇到了一个特殊的问题。他请我帮忙,我能够找到导致问题的代码。以下是一种方法:

 public BillingService getBillingCodeByCode(String code){
    List list = billingServiceDao.findBillingCodesByCode( code,"BC");
    if(list == null || list.size() ==0 ){
        return null;
    }
    return (BillingService) list.get(0);
  }
billingServiceDao
Spring
容器初始化:

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

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

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

return new ArrayList<BillingService>(list);

一开始就完全违背了使用Spring的目的。

我之所以看到这个问题,是因为我未能在带有
@Transactional
的服务中注释方法。当调用另一个方法时(即使在同一个类中),Hibernate似乎会关闭会话,除非调用方进行了适当的注释。

此链接可能会帮助您:谢谢亲爱的,我将对此进行测试(在发回列表之前提取列表)。但是第二件事(
(BillingServiceDao)SpringUtils.getBean(“BillingServiceDao”);
)超出了我的范围:Dnope,仍然得到相同的异常。我在问题中也添加了堆栈跟踪。那么您没有在DAO级别打开会话。您需要实现OpenSessionInView模式(请参见上面来自Nandkumar的链接)。
return new ArrayList<BillingService>(list);
private static BillingServiceDao billingServiceDao = 
              (BillingServiceDao) SpringUtils.getBean("billingServiceDao");