2010-09-02 153 views
0

我使用Turbine 2.3.2与Hibernate 3.我的问题是,当我的(Velocity 1.6.4)模板被执行时,Hibernate会话不是活动的,而且我正在访问数据库中的数据Hibernate需要延迟初始化。因此我得到一个LazyInitializationException - 没有会话错误。Web应用程序请求过滤器

因为我希望我的Hibernate会话在velocity模板执行时仍然存在我希望在Velocity模板之前和之后执行一个类。这样我就可以在一个地方打开和关闭我的Hibernate会话。 (在Hibernate中禁用懒惰初始化不是我的选择)。是否有任何可能与Turbine写一种在Velocity模板执行之前和之后执行的监听器或过滤器(我不确定如何调用它)相关?或者,也许servlet容器可以过滤请求....你会推荐什么选项?

回答

1

试试看春天OpenSessionInViewFilter。它打开Hibernate Session并将其分配给threadlocal。这样,您可以在数据访问层中选择并使用它。

+0

感谢您的回答。 – Atticus 2010-09-03 08:49:26

0

你的问题似乎是关于(在)着名的开放式会议视图(OSIV)模式。 看看JBoss wiki上的Open Session in View页面,你会发现一个基于过滤器的实现(基于非Spring)。

1

在View中打开会话不是一个干净的解决方案。你可以在你的标准中进行配置(如果你使用它的话)Hibernate必须急切地获取哪些关联路径。 如果您使用HQL,只需在会话仍处于打开状态时“触摸”关联。

+0

有了这个解决方案,我将不得不配置出现此问题的每个对象。这将是很多对象,所以我不会这样做。我已经说过,禁用懒惰初始化(即使它只涉及“只有”几个对象)不是一个选项。 – Atticus 2010-09-02 13:56:55