【问题标题】:Spring/Hibernate: Keep session open for thread, or open a new one?Spring/Hibernate:保持会话打开线程,或打开一个新的?
【发布时间】:2011-06-11 18:50:42
【问题描述】:

我将 Spring 3 与 Hibernate 一起使用。我有一个用户请求,它在 spring 控制器中启动一个 java 线程,然后发送一个响应,因此当用户 http 响应已经发送时,该线程可能会继续工作。

如果我在线程中使用惰性集合,我会收到以下错误:

org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: my.model.MyClass.lazyCollection, no session or session was closed

我读到我可以使用 Hibernate.initialize(entity) 来完全获取惰性集合,但我不能使用它,因为我只是在线程中填充集合。此外,我尝试使用 merge() 但这仍然不能解决问题。

有没有办法手动保持会话打开或为线程打开一个新会话?

感谢您的帮助!

【问题讨论】:

  • 你是在一个网络应用程序中,所以一个http请求是一个线程,还是你别的什么?
  • 是的,我在一个带有 spring mvc 的 Web 应用程序中。但是,除了请求线程之外,我还自己创建了一个。

标签: hibernate spring jakarta-ee servlet-filters


【解决方案1】:

您可以使用 Spring 将 SessionFactory 注入您的 Runnable,从中打开一个 Session,并使用 vanilla Hibernate API 管理 SessionTransaction 的生命周期,而无需依赖会话管理春天的魔力。

【讨论】:

  • 谢谢!我仍然可以通过扩展 HibernateDaoSupport 创建我的 DAO 吗?
  • 在这种情况下您会使用 HibernateDaoSupport 的哪些功能?根据您的描述,您希望避开会话和事务管理功能。据我所知,yiumight 唯一想使用的其他功能是异常翻译。这可以使用static.springsource.org/spring/docs/3.0.x/javadoc-api/org/… 来实现
  • @Erik 抱歉,之前的链接不正确。请改用static.springsource.org/spring/docs/3.0.x/javadoc-api/org/…
  • 我现在按照您的建议进行操作,实际上并没有那么复杂。请注意不要弄乱多个会话等等。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多