NHibernate / Spring.Net / Asp.Net WebForms - открытая транзакция по запросу - PullRequest
2 голосов
/ 03 сентября 2011

В настоящее время я использую NHibernate с Spring.Net и использую модуль Spring Session In View. Насколько я могу судить, этот модуль только открывает сеанс в BeginRequest и закрывает его в EndRequest. На самом деле он не фиксирует и не сбрасывает сеанс в EndRequest.

Я знаю, что вы можете использовать атрибут Spring [Transaction] для украшения отдельных методов обслуживания, которые будут выполнять фиксацию в конце метода, но я не хочу использовать эту технику.

Есть ли способ настроить модуль OSIV Spring, чтобы он сбрасывал сеанс в EndRequest? Если нет, то есть ли простой способ реализовать мой Open Session In View, который бы этого достиг?

Я попытался реализовать пример "сеанс на веб-запрос" из поваренной книги NH 3, но выдает ошибку 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

Edit:

После прочтения http://forum.springsource.org/archive/index.php/t-16949.html я начинаю задаваться вопросом, является ли транзакция для запроса хорошей идеей.

Ответы [ 2 ]

2 голосов
/ 05 сентября 2011

Есть несколько веских причин, по которым режим сброса установлен на FlushMode.NEVER: http://forum.springframework.net/showthread.php?3303-OpenSessionInViewModule

Эрих Эйхингер (SpringSource GmbH)

Наличие FlushMode.NEVER в OSIV - этопо дизайну.Это связано с тем, что если OSIV сбросил ожидающие изменения во время «EndRequest» и произошла ошибка, все ответы уже были отправлены клиенту.Не было бы никакого способа сообщить клиенту об ошибке.Таким образом, можно изменить FlushMode по умолчанию, но я бы не рекомендовал его.

Тем не менее, существует недокументированная функция.Вы можете установить режим очистки, установив пару appSettings ключ / значение в вашем web.config:

<configuration>
  <appSettings>
    ...
    <add 
      key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.DefaultFlushMode"
      value="Auto" 
      />
  </appSettings>
  ...
</configuration>
0 голосов
/ 03 сентября 2011

Я не знаком с Spring.NET, но: фабрика сессий должна быть только одна для всего приложения. Подробности здесь . Сессия открывается в начале каждого запроса.

Я не знаю, изменилось ли это в NH3, но в нашем приложении NH 2 мы создаем фабрику сессий следующим образом:

NHibernateConfiguration.BuildSessionFactory()
...