Spring上下文刷新使Hibernate会话抛出此异常:找不到当前线程的Session

时间:2013-04-15 08:54:09

标签: spring hibernate spring-mvc hibernate-session

我正在开发一个具有多个弹簧上下文的Web应用程序。它有一个主要的上下文,包含业务逻辑,hibernate会话和应用程序的核心需求,其他上下文用于spring mvc绑定。通常应用程序工作正常,但是当我刷新主上下文并尝试从其他上下文到达hibernate会话时,hibernate会抛出此异常:

org.hibernate.HibernateException: No Session found for current thread at         
org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at 
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:980)...

但有趣的是应用程序可以进行启动启动,包括从db中选择大量数据。

有没有办法可以刷新弹簧环境的安全和声音?

P.S:我可以毫无问题地获得其他弹簧上下文对象。并且应用程序在多个上下文中工作正常,直到我刷新主要上下文。我尝试刷新mvc上下文,在主上下文后我从中调用hibernate会话。在mvc上下文中仍然是相同的例外。

1 个答案:

答案 0 :(得分:0)

你遇到这个错误的原因是你正在从线程下面敲击Hibernate会话。根据我的记忆,会话与创建它们的线程相关联。这就是为什么你不能将代理的Hibernate实体传递给像BlazeDS这样的框架。一旦代理实体离开线程,会话就不再与之关联,并且您无法继续处理被代理的项目。

一种解决方案可能是不使用Proxies,并急切加载所有关系。然而,这将破坏使用ORM的主要好处之一。或者,如果你能以某种方式重新启动问题中的所有线程,那么创建与新的Hibernate会话相关联的新线程也可能会起作用。