我在hibernate和延迟加载方面遇到问题。
背景:我有一个Spring MVC Web应用程序,我将Hibernate用于持久层。我正在使用OpenSessionInViewFilter使我能够在视图层中延迟加载实体。我正在扩展HibernateDaoSupport类,并使用HibernateTemplate保存/加载对象。一切都进行得很好。直至现在。
问题:我有一个可以通过Web请求启动的任务。当请求被路由到控制器时,控制器将为此任务创建一个新的Runnable并启动线程来运行该任务。因此,原始线程将返回,并且由Task的新线程无法使用由OpenSessionInViewFilter放入ThreadLocal的Hibernate会话。因此,当任务执行一些数据库工作时,我得到了臭名昭著的LazyInitializationException。
有人能建议我使任务可用Hibernate会话的最佳方法吗?
谢谢阅读。
制作Runnable一个Spring bean并在上添加@Transactional注释run。您必须警告您,该异步任务将不会在与Web请求相同的事务中运行。
Runnable
@Transactional
run
并且请不要启动新线程,请使用池/执行器。