NHibernate的+ Spring.NET懒加载失败 - 没有会话(NHibernate + S

2019-09-18 00:43发布

我使用Spring.NET AOP事务和会话管理与NHibernate。 当用户提出了一些请求太快 - 懒加载失败,出现异常“没有会话或会话已关闭”。

我在NHibernate的配置使用SpringSessionContext作为CurrentSessionContext

public class FluentSessionFactory : LocalSessionFactoryObject
{
    protected override ISessionFactory NewSessionFactory(Configuration config)
    {
        var conf = Fluently
            .Configure()
            .Database(
                MsSqlConfiguration
                    .MsSql2008
                    .ConnectionString(c => c.FromConnectionStringWithKey("MyConnection"))
                    // TODO: use ExposeConfiguration method
                    .CurrentSessionContext<SpringSessionContext>()
                )
            .Mappings(
                m => m.FluentMappings
                    .AddFromAssembly(this.GetType().Assembly)
            )
            .BuildSessionFactory();
        return conf;
    }
}

在XML配置:

<object id="SessionFactory" type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
    <property name="DbProvider" ref="DbProvider" />
</object>

和OpenSessionInView模块

<system.webServer>
    <validation validateIntegratedModeConfiguration="false"/>
    <modules runAllManagedModulesForAllRequests="true">
        <add name="OpenSessionInView"  type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>
    </modules>
</system.webServer>

应用实现了从数据库中获取的实体下一个工作流程:查看 - >控制器 - >管理 - >库和同向另一侧。 所以会话每个请求,交易创造的 - 每调用经理。

<object id="TransactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate31">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="SessionFactory" ref="SessionFactory"/>
</object>

<tx:advice id="TxAdvice" transaction-manager="TransactionManager">
    <tx:attributes>
        <tx:method name="*"/>
    </tx:attributes>
</tx:advice>

<object id="Pointcut" type="Spring.Aop.Support.SdkRegularExpressionMethodPointcut, Spring.Aop">
    <property name="patterns">
        <list>
            <value>MyAppication.Managers.AccountManager</value>
            <value>MyAppication.Managers.CompanyManager</value>
        </list>
    </property>
</object>

<aop:config>
    <aop:advisor advice-ref="TxAdvice" pointcut-ref="Pointcut"/>
</aop:config>

什么是这种行为的可能原因以及如何解决这个问题(Not.LazyLoad()和NHibernateUtil.Initialize()是不是在我的情况下可以接受的变体)?

Answer 1:

1.会话工厂配置为OpenSessionInViewModule

您可能忘记来配置的会话工厂OpenSessionInViewModule

<appSettings>
  <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" 
       value="SessionFactory"/>
</appSettings>

这已在应用程式的设定来完成。

2.纠正FluentNHibernate根据春季会议的工厂?

你似乎是在代码中配置您的会话工厂。 您是否尝试过配置像文档中描述会话工厂和BennyM 的博客 ? 你NewSessionFactory方法返回从直接从功能NHibernate会话工厂,绕过所有spring.net支持。

3.是您的会话工厂事务感知?

<object id="SessionFactory" 
        type="IndustryTracker.NHibernateRepository.FluentSessionFactory, IndustryTracker.NHibernateRepository">
  <property name="DbProvider" ref="DbProvider" />
  <!-- provides integation with Spring's declarative transaction management features -->
  <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
</object>

4.请问您的控制器有依赖关系scope="application"或没有范围定义?

我可能已经在这里找错了方向。 如果您的控制器具有相关性application范围,这将意味着,快速请求可能干扰。 默认值是"scope="application" ;所以你要检查无范围的定义过于合作者查看的文档。 网络范围 。



Answer 2:

After some search I found that problem was in configuration. There was spring WebSupportModule missing http module in config, so the correct one is:

    <httpModules>
      <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/>
      <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate31"/>  
    </httpModules>

So Marijn was right - it was weak wiring to spring.



文章来源: NHibernate + Spring.NET lazy loading failed - no session