一尘不染

休眠会话线程

hibernate

我在hibernate和延迟加载方面遇到问题。

背景:我有一个Spring MVC
Web应用程序,我将Hibernate用于持久层。我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体。我正在扩展HibernateDaoSupport类,并使用HibernateTemplate保存/加载对象。一切都进行得很好。直至现在。

问题:我有一个可以通过Web请求启动的任务。当请求被路由到控制器时,控制器将为此任务创建一个新的Runnable并启动线程来运行该任务。因此,原始线程将返回,并且由Task的新线程无法使用由OpenSessionInViewFilter放入ThreadLocal的Hibernate会话。因此,当任务执行一些数据库工作时,我得到了臭名昭著的LazyInitializationException。

有人能建议我使任务可用Hibernate会话的最佳方法吗?

谢谢阅读。


阅读 269

收藏
2020-06-20

共1个答案

一尘不染

制作Runnable一个Spring
bean并在上添加@Transactional注释run。您必须警告您,该异步任务将不会在与Web请求相同的事务中运行。

并且请不要启动新线程,请使用池/执行器。

2020-06-20