我目前正在使用Spring.Net的NHibernate并使用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后,我开始怀疑每个请求的交易是否是个好主意。
答案 0 :(得分:2)
为什么将刷新模式设置为FlushMode.NEVER有一些强有力的理由:http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule
Erich Eichinger(SpringSource GmbH)OSIV上的FlushMode.NEVER是设计使然。这是因为如果OSIV 在“EndRequest”期间刷新挂起的更改并发生错误,全部 响应已经发送给客户端。没有办法 告诉客户有关错误的信息。因此有可能改变 默认FlushMode但我不推荐它。
那就是说,有一个没有文档的功能。您可以通过在appSettings
中设置web.config
键/值对来设置刷新模式:
<configuration>
<appSettings>
...
<add
key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode"
value="Auto"
/>
</appSettings>
...
</configuration>
答案 1 :(得分:-1)
我不熟悉Spring.NET,但是:会话工厂应该只适用于整个应用程序。详情here。 会话在每个请求开始时打开。
我不知道这是否在NH3中发生了变化,但在我们的NH 2应用程序中,我们以这种方式构建会话工厂:
NHibernateConfiguration.BuildSessionFactory()