1

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

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)...

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

有没有一种方法可以让我安全地刷新 spring 上下文?

PS:我可以毫无问题地获得其他弹簧上下文对象。在我刷新主上下文之前,应用程序可以在多个上下文中正常工作。我尝试在主上下文之后刷新 mvc 上下文,我从中调用休眠会话。在那个 mvc 上下文中仍然是同样的例外。

4

1 回答 1

0

您收到该错误的原因是您正在从线程下方删除 Hibernate 会话。据我所知,这些会话与创建它们的线程相关联。这就是为什么您不能将代理的 Hibernate 实体传递给像 BlazeDS 这样的框架的原因。一旦被代理的实体离开线程,会话就不再与之关联,并且您失去了追踪被代理的项目的能力。

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

于 2013-04-15T11:54:29.617 回答