There is no Hibernate session associated with thread exception using asp mvc 3, nhibernate 3.2 and spring.net 1.3.2

I am using ASP.Net MVC 3, spring.net 1.3.2 and nhibernate 3.2. I struggled to get the web application to work in IIS 7.5. It works great in Visual Studio 2010.

The error I get is

No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: NHibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here] Spring.Data.NHibernate.SpringSessionContext.CurrentSession() in c:\_prj\spring-net\trunk\src\Spring\Spring.Data.NHibernate12\Data\NHibernate\SpringSessionContext.cs:72 Technolog.Rma.Business.Repositories.RepairBatchDAO.findRepairBatchPageCount(String login, Int32 rowsPerPage) in C:\work\samplemvc\src\Technolog.Rma.Business\Repositories\RepairBatchDAO.cs:55 _dynamic_Technolog.Rma.Business.Repositories.RepairBatchDAO.findRepairBatchPageCount(Object , Object[] ) +273 Spring.Reflection.Dynamic.SafeMethod.Invoke(Object target, Object[] arguments) in c:\_prj\spring-net\trunk\src\Spring\Spring.Core\Reflection\Dynamic\DynamicMethod.cs:156 Spring.Aop.Framework.DynamicMethodInvocation.InvokeJoinpoint() in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\DynamicMethodInvocation.cs:100 Spring.Dao.Support.PersistenceExceptionTranslationInterceptor.Invoke(IMethodInvocation invocation) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data\Dao\Support\PersistenceExceptionTranslationInterceptor.cs:181 <snip/> 

My web.config file

 <?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=152368 Spring.Context.Support.ContextHandler, Spring.Core <resource uri="~/Config/propertyConfigurer.xml" /> --> <configuration> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3" /> </sectionGroup> </configSections> <appSettings> <add key="dataFile" value="App_Data\data.db3" /> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="SessionFactory"/> </appSettings> <spring> <context> <resource uri="file://~/Config/propertyConfigurer.xml" /> <resource uri="file://~/Config/sessionFactory.xml" /> <resource uri="file://~/Config/mappers.xml" /> <resource uri="file://~/Config/repositories.xml" /> <resource uri="file://~/Config/controllers.xml" /> <resource uri="file://~/Config/scopedobjects.xml" /> <resource uri="file://~/Config/utils.xml" /> </context> </spring> <system.web> <httpModules> <!-- <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/> --> </httpModules> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> <pages> <namespaces> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> </namespaces> </pages> <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" /> </authentication> <customErrors mode="Off"/> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/> </modules> <!-- <handlers> <add name="SpringPageHandler" verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/> <add name="SpringWebServiceHandler" verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web" /> <add name="SpringContextMonitor" verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/> </handlers> --> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 

SessionFactory.xml file

 <?xml version="1.0" encoding="utf-8" ?> <objects xmlns="http://www.springframework.net" xmlns:db="http://www.springframework.net/database" xmlns:tx="http://www.springframework.net/tx"> <object id="siteRoot" type="System.Web.Hosting.HostingEnvironment, System.Web" factory-method="get_ApplicationPhysicalPath" /> <object id="dataFile" type="System.IO.Path, mscorlib" factory-method="Combine"> <constructor-arg name="path1" ref="siteRoot" /> <constructor-arg name="path2" value="${dataFile}" /> </object> <db:provider id="dbProvider" provider="System.Data.SqlClient" connectionString="Data Source=AJASQL7;Initial Catalog=Xanadu;User ID=RMA;Password=RMA;"/> <object id="sessionFactory" scope="application" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32"> <property name="DbProvider" ref="dbProvider"/> <property name="MappingAssemblies"> <list> <value>Technolog.Rma.Business</value> </list> </property> <property name="HibernateProperties"> <dictionary> <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/> <entry key="dialect" value="NHibernate.Dialect.MsSql7Dialect"/> <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/> <entry key="use_proxy_validator" value="false" /> <entry key="current_session_context_class" value="Spring.Data.NHibernate.SpringSessionContext, Spring.Data.NHibernate32"/> </dictionary> </property> </object> <!-- Transaction Management Strategy - local database transactions --> <object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate32"> <property name="DbProvider" ref="dbProvider"/> <property name="SessionFactory" ref="sessionFactory"/> </object> <!-- Exception translation object post processor --> <object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/> </objects> 

Part of my RepairBatchDao

 [Repository] class RepairBatchDAO : IRepairBatchDAO { public ISessionFactory SessionFactory { get; set; } public long findRepairBatchPageCount(string login, int rowsPerPage) { var rowCount = 1L; var session = SessionFactory.GetCurrentSession(); // line 55 var transaction = session.BeginTransaction(); try { transaction = session.BeginTransaction(); var hqlCountQuery = session.CreateQuery("select count(*) from Technolog.Rma.Business.Domain.RepairBatch rb where rb.Customer.Login=?") .SetParameter(0, login); rowCount = hqlCountQuery.UniqueResult<long>(); transaction.Commit(); return (rowCount + rowsPerPage - 1) / rowsPerPage; } catch { if (transaction != null) transaction.Rollback(); } finally { if (session != null) session.Close(); // I shouldn't be doing this... } return 0L; } // snip ... 

I spent too much time trying to fix it myself. I hope someone can point me in the right direction. I checked various posts on stackoverflow (too much to mention), but they did not help.

I am a Java guy, and this is my first .net project, so I'm not sure I did something stupid.

09/25/2012

I made changes to my customerDAO

  public class CustomerDAO : ICustomerDAO { public ISessionFactory SessionFactory { get; set; } private TransactionTemplate tt; public IPlatformTransactionManager TransactionManager { set { tt = new TransactionTemplate(value); } } <snip/> public Customer find(string login) { IList<Customer> customers; Object result = tt.Execute(delegate(ITransactionStatus status) //line 42 { var transaction = status.Transaction; var session = this.SessionFactory.GetCurrentSession(); //var transaction = session.BeginTransaction(); try { customers = session.CreateQuery("from Technolog.Rma.Business.Domain.Customer Customer where Customer.Login=?") .SetParameter(0, login) .List<Customer>(); if (customers.Count > 0) { return customers[0]; } } catch { } finally { if (session != null) session.Close(); } return null; }); return (Customer)result; } 

The error I'm getting right now is

 Server Error in '/RMA' Application. -------------------------------------------------------------------------------- Cannot access a disposed object. Object name: 'AdoTransaction'. Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. Exception Details: System.ObjectDisposedException: Cannot access a disposed object. Object name: 'AdoTransaction'. Source Error: An unhandled exception was generated during the execution of the current web request. Information regarding the origin and location of the exception can be identified using the exception stack trace below. Stack Trace: [ObjectDisposedException: Cannot access a disposed object. Object name: 'AdoTransaction'.] NHibernate.Transaction.AdoTransaction.Commit() +425 Spring.Data.NHibernate.HibernateTransactionManager.DoCommit(DefaultTransactionStatus status) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data.NHibernate\Data\NHibernate\HibernateTransactionManager.cs:579 Spring.Transaction.Support.AbstractPlatformTransactionManager.ProcessCommit(DefaultTransactionStatus status) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data\Transaction\Support\AbstractPlatformTransactionManager.cs:853 Spring.Transaction.Support.TransactionTemplate.Execute(TransactionDelegate transactionMethod) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data\Transaction\Support\TransactionTemplate.cs:159 Technolog.Rma.Business.Repositories.CustomerDAO.find(String login) in C:\work\samplemvc\src\Technolog.Rma.Business\Repositories\CustomerDAO.cs:42 _dynamic_Technolog.Rma.Business.Repositories.CustomerDAO.find(Object , Object[] ) +147 Spring.Reflection.Dynamic.SafeMethod.Invoke(Object target, Object[] arguments) in c:\_prj\spring-net\trunk\src\Spring\Spring.Core\Reflection\Dynamic\DynamicMethod.cs:156 Spring.Aop.Framework.DynamicMethodInvocation.InvokeJoinpoint() in c:\_prj\spring-net\trunk\src\Spring\Spring.Aop\Aop\Framework\DynamicMethodInvocation.cs:100 Spring.Dao.Support.PersistenceExceptionTranslationInterceptor.Invoke(IMethodInvocation invocation) in c:\_prj\spring-net\trunk\src\Spring\Spring.Data\Dao\Support\PersistenceExceptionTranslationInterceptor.cs:190 CompositionAopProxy_33677284ca854c0b8c01a5b0ae0a0524.find(String login) +383 Technolog.Rma.Web.Controllers.HomeController.Index(Int32 page) in C:\work\samplemvc\src\Technolog.Rma.Web\Controllers\HomeController.cs:36 lambda_method(Closure , ControllerBase , Object[] ) +112 System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +248 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +39 System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +125 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +640 System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +312 System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +691 System.Web.Mvc.Controller.ExecuteCore() +162 System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +305 System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +62 System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +20 System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +469 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +375 -------------------------------------------------------------------------------- Version Information: Microsoft .NET Framework Version:4.0.30319; ASP.NET Version:4.0.30319.272 
+4
source share
2 answers

Following the comments above, I followed the instructions for implementing osiv. I also found that I was closing the session when I had to leave it open, causing

 Cannot access a disposed object. 

My web.config file for using OSIV

 <?xml version="1.0" encoding="utf-8"?> <!-- For more information on how to configure your ASP.NET application, please visit http://go.microsoft.com/fwlink/?LinkId=152368 Spring.Context.Support.ContextHandler, Spring.Core <resource uri="~/Config/propertyConfigurer.xml" /> --> <configuration> <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.MvcContextHandler, Spring.Web.Mvc3" /> </sectionGroup> </configSections> <appSettings> <add key="dataFile" value="App_Data\data.db3" /> <add key="ClientValidationEnabled" value="true"/> <add key="UnobtrusiveJavaScriptEnabled" value="true"/> <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="SessionFactory"/> </appSettings> <spring> <context> <resource uri="file://~/Config/propertyConfigurer.xml" /> <resource uri="file://~/Config/sessionFactory.xml" /> <resource uri="file://~/Config/mappers.xml" /> <resource uri="file://~/Config/repositories.xml" /> <resource uri="file://~/Config/controllers.xml" /> <resource uri="file://~/Config/scopedobjects.xml" /> <resource uri="file://~/Config/utils.xml" /> </context> </spring> <system.web> <httpModules> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/> </httpModules> <compilation debug="true" targetFramework="4.0"> <assemblies> <add assembly="System.Web.Abstractions, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Helpers, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Routing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> <add assembly="System.Web.WebPages, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" /> </assemblies> </compilation> <pages> <namespaces> <add namespace="System.Web.Helpers" /> <add namespace="System.Web.Mvc" /> <add namespace="System.Web.Mvc.Ajax" /> <add namespace="System.Web.Mvc.Html" /> <add namespace="System.Web.Routing" /> <add namespace="System.Web.WebPages" /> </namespaces> </pages> <authentication mode="Forms"> <forms loginUrl="~/Account/LogOn" timeout="2880" /> </authentication> <customErrors mode="Off"/> </system.web> <system.webServer> <validation validateIntegratedModeConfiguration="false" /> <modules runAllManagedModulesForAllRequests="true"> <add name="Spring" type="Spring.Context.Support.WebSupportModule, Spring.Web"/> <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate32"/> </modules> <!-- <handlers> <add name="SpringPageHandler" verb="*" path="*.aspx" type="Spring.Web.Support.PageHandlerFactory, Spring.Web"/> <add name="SpringWebServiceHandler" verb="*" path="*.asmx" type="Spring.Web.Services.WebServiceHandlerFactory, Spring.Web" /> <add name="SpringContextMonitor" verb="*" path="ContextMonitor.ashx" type="Spring.Web.Support.ContextMonitor, Spring.Web"/> </handlers> --> </system.webServer> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" /> <bindingRedirect oldVersion="1.0.0.0-2.0.0.0" newVersion="3.0.0.0" /> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" /> <bindingRedirect oldVersion="0.0.0.0-4.0.7.0" newVersion="4.0.7.0" /> </dependentAssembly> </assemblyBinding> </runtime> </configuration> 

Please note that the links to osiv and spring WebSupportModule are in / for them to work in my dev environment, and also in / for the application to work in IIS 7.5

I also use lazy loading in my views, so osiv is the best solution. I showed programmatic transaction control in my question because, as far as I got, I was trying to come up with a solution.

+1
source

You have configured TransactionManager , but you are not using it. Before calling SessionFactory.GetCurrentSession(); try starting a transaction in your transaction manager. When using Spring transaction management, you should not explicitly use NHibernate transaction support.

You can do this programmatically or declaratively ; at this point I will first try the software approach.

0
source

Source: https://habr.com/ru/post/1435939/


All Articles