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");