使用 Grails 时我应该关心 Open Session in View 吗?

Posted

技术标签:

【中文标题】使用 Grails 时我应该关心 Open Session in View 吗?【英文标题】:Should I care about Open Session in View when using Grails? 【发布时间】:2011-03-15 18:08:56 【问题描述】:

根据我结合使用 spring MVC 和 hibernate 的经验,我知道在渲染视图时寻址到延迟获取的集合时会发生延迟异常问题。 它通过引入 OpenSessionInViewInterceptorOpenSessionInViewFilter 来修复纯 spring+hibernate 世界,从而为每个请求启用一个休眠会话。

所以问题是:我应该关心 grails 中的这个问题,还是默认启用每个请求一个会话的行为。

如果这不是 grails 的默认设置,请提供一些代码来实现此行为。

谢谢。

【问题讨论】:

【参考方案1】:

Grails 注册了一个自定义的 OpenSessionInViewInterceptor 子类(它增加了 WebFlow 感知)。因此,在 Web 请求的上下文中所做的任何事情都会有一个打开的会话,并且延迟加载的引用和集合将得到解析。

【讨论】:

对于视图状态,当我将域实例设置为 PageScope 变量(来自 taglib)并尝试在视图中访问它时,为什么会出现延迟初始化异常,无法初始化代理没有错误.会话是否仍处于打开状态,因为标签位于 gsp(layout) 中,它作为视图状态的一部分呈现。愿你回答***.com/questions/21456784/… 我不确定细节,但这与 Sitemesh 和页面呈现顺序有关。我认为会话在控制器操作运行后关闭,但在 GSP 呈现之前。一般来说,最好将所有必要的数据传递给视图以避免这个问题和其他问题。通过允许在 GSP 中发生延迟加载,您正在从 GSP 执行数据库请求,这通常是一种不好的做法 问题是,我需要访问布局中的某些域。在这种情况下,正确的方法是什么? 另外,@Burt 上面的设置对于普通动作来说效果很好,只是 flowactions 有这个问题,所以在渲染布局时 session 肯定是可用的,但是在 flow action 的情况下它关闭了

以上是关于使用 Grails 时我应该关心 Open Session in View 吗?的主要内容,如果未能解决你的问题,请参考以下文章

设计消息中间件时我关心什么?(解密电商数据一致性与完整性实现,含PPT)

我应该在 grails 2.0 中使用哪个贝宝/支付插件?

grails4中的数据库迁移插件错误

Grails 标记不解析其主体中的变量

在 Grails 3.x 中应该使用 Spring Sec OAuth 的哪个插件/模块?

我应该将瞬态域类放在 grails 应用程序中的啥位置?