【问题标题】:Spring context refreshing makes Hibernate session throw this exception: No Session found for current threadSpring 上下文刷新使 Hibernate 会话抛出此异常:No Session found for current thread
【发布时间】:2013-04-15 08:54:08
【问题描述】:

我正在开发一个具有多个 Spring 上下文的 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 上下文?

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

【问题讨论】:

    标签: spring hibernate spring-mvc hibernate-session


    【解决方案1】:

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

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

    【讨论】:

    • 好的,但问题是:我不在 Spring 上下文中创建实体,它们是在休眠会话中创建的,并且与 Spring 上下文无关。如果线程被销毁并创建,则在新线程中创建休眠会话和实体。在它应该在多个春季上下文中工作之前,我尝试了上下文刷新。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多