【发布时间】:2011-11-09 12:46:51
【问题描述】:
我目前正在使用 NHibernate 和 Spring.Net 并使用 Spring 的 Open Session In View 模块。据我所知,此模块仅在 BeginRequest 上打开会话并在 EndRequest 上关闭它。它实际上并没有在 EndRequest 上提交或刷新会话。
我知道您可以使用 Spring 的 [Transaction] 属性来装饰各个服务方法,这些方法将在方法结束时执行提交,但我不想使用这种技术。
有什么方法可以设置 Spring 的 OSIV 模块,以便在 EndRequest 上刷新会话?如果没有,是否有一种简单的方法来实现我自己的 Open Session In View 来实现这一点?
我已尝试实现 NH 3 Cookbook 中的“每个 Web 请求的会话”示例,但它在 CurrentSessionContext 上引发错误:
protected void Application_BeginRequest(object sender, EventArgs e)
{
var sessionFactory = (ISessionFactory) ContextRegistry.GetContext().GetObject("MySessionFactory");
var session = sessionFactory.OpenSession();
CurrentSessionContext.Bind(session);
}
protected void Application_EndRequest(object sender, EventArgs e)
{
var sessionFactory = (ISessionFactory)ContextRegistry.GetContext().GetObject("MySessionFactory");
var session = CurrentSessionContext.Unbind(sessionFactory);
session.Dispose();
}
注意:上面的代码只是试图复制 Spring.Net 目前正在做的事情。我计划在它工作后更新它以刷新会话。
我假设上面的代码不起作用,因为我正在使用 Spring.Net 设置 NH 及其 SessionFactory,这可能会使书中的示例无效。
任何帮助/建议将不胜感激。
我正在使用 NHibernate 3.2 和 Spring 1.3.2
编辑:
阅读http://forum.springsource.org/archive/index.php/t-16949.html 后,我开始怀疑每个请求的事务是否是个好主意。
【问题讨论】:
-
刷新模式设置为 FlushMode.NEVER 的原因有很多:forum.springframework.net/… 在 OSIV 上设置 FlushMode.NEVER 是设计使然。这是因为如果 OSIV 在“EndRequest”期间刷新挂起的更改并发生错误,则所有响应都已发送到客户端。没有办法告诉客户这个错误。因此可以更改默认的 FlushMode,但我不建议这样做。
-
@Andreas 我现在已经放弃了我最初的想法。我最初的想法背后的主要原因是因为我们有一个现有的 Web 应用程序,它在代码背后有很多业务逻辑。我认为更新 OSIV 以在 EndRequest 上提交会更简单,而不必将代码重构为带有 Transaction 属性的服务方法。但看起来我将不得不在这个问题上硬着头皮。如果您想针对我的建议给出这个建议的答案,那么我很乐意接受。谢谢。
标签: asp.net nhibernate spring.net