2010-02-22 30 views
4

我試圖使用spring.net和nihibernate爲我的數據層。Spring.net與NHibernate和「沒有休眠會話綁定到線程錯誤」

我有一個簡單的DAO對象,包括下面的代碼:

[Transaction] 
public long Save(Request entity) 
{ 
    return (long)CurrentSession.Save(entity);  
} 

每當這個代碼被稱爲我收到以下錯誤:

「沒有Hibernate的Session綁定到線程,配置不允許在此處創建非事務性的「

我的DAO圖層具有以下配置,它在我的web.config中:

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net" 
     xmlns:tx="http://www.springframework.net/tx" 
     xmlns:db="http://www.springframework.net/database" 
     xmlns:aop="http://www.springframework.net/aop" 
     > 

    <!-- Referenced by main application context configuration file --> 
    <description> 
    The Northwind object definitions for the Data Access Objects. 
    </description> 

    <!-- Property placeholder configurer for database settings --> 
    <object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 
    <property name="ConfigSections" value="databaseSettings"/> 
    </object> 

    <!-- Database and NHibernate Configuration --> 
    <db:provider id="DbProvider" 
        provider="SqlServer-2.0" 
        connectionString="Data Source=ME-LT;Initial Catalog=SupplyAndDemand;Integrated Security=True"/> 

    <object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate21"> 
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
     <value>SAD.Providers.NHibernate</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 

     <entry key="connection.provider" 
       value="NHibernate.Connection.DriverConnectionProvider"/> 

     <entry key="dialect" 
       value="NHibernate.Dialect.MsSql2005Dialect"/> 

     <entry key="connection.driver_class" 
       value="NHibernate.Driver.SqlClientDriver"/> 

     </dictionary> 
    </property> 

    <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
    </object> 


    <object id="transactionManager" 
     type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate21"> 
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="SessionFactory" ref="NHibernateSessionFactory"/> 

    </object> 

    <!-- Data Access Objects --> 
    <object id="RequestDao" type="SAD.Providers.Nhibernate.NHibernateRequestDao, SAD.Providers.Nhibernate"> 
    <property name="SessionFactory" ref="NHibernateSessionFactory" /> 
    </object> 


<tx:attribute-driven transaction-manager="transactionManager"/> 

</objects> 

在我的web.config我已經包含了參考解析:

<parser type="Spring.Transaction.Config.TxNamespaceParser, Spring.Data"/> 

,並引用我的dao.xml作爲一個組件資源。

該DOA被注入另一個彈簧配置的對象,從中調用Save。

任何想法我做錯了什麼?正如你看到的我是包括配置

<tx:attribute-driven transaction-manager="transactionManager"/> 

我連接到彈簧的代碼,然後放置的TransactionInterceptor的invoke方法一個破發點 - 它永遠不會被調用 - 所以,或許正在爲吾道創建代理心不是對象?

以下是完整的堆棧跟蹤:

<StackTrace><![CDATA[at Spring.Data.NHibernate.SpringSessionContext.CurrentSession() in F:\Spring.NET\Spring.NET\src\Spring\Spring.Data.NHibernate12\Data\NHibernate\SpringSessionContext.cs:line 70 
    at NHibernate.Impl.SessionFactoryImpl.GetCurrentSession() 
    at sad.Providers.Nhibernate.NHibernateDao.get_CurrentSession() in F:\PersonnalProjects\sad\trunk\src\sad\sad.Providers.Nhibernate\nHibernateDao.cs:line 29 
    at sad.Providers.Nhibernate.NHibernateRequestDao.Save(Request entity) in F:\PersonnalProjects\sad\trunk\src\sad\sad.Providers.Nhibernate\NHibernateRequestDao.cs:line 41 
    at sad.Messaging.RequestManager.RequestManager.ProcessRequest(UserCredentials userCredentials, Request request) in F:\PersonnalProjects\sad\trunk\src\sad\sad.Messaging.RequestManager\RequestManager.cs:line 39 
    at sad.Messaging.UI.Web.RequestManagerService.ProcessRequest(UserCredentials userCredentials, Request request) in F:\PersonnalProjects\sad\trunk\src\sad\sad.Messaging.UI.Web\RequestManagerService.cs:line 28 
    at requestManagerService.ProcessRequest(UserCredentials userCredentials, Request request) 
    at SyncInvokeProcessRequest(Object , Object[] , Object[]) 
    at System.ServiceModel.Dispatcher.SyncMethodInvoker.Invoke(Object instance, Object[] inputs, Object[]& outputs) 
    at System.ServiceModel.Dispatcher.DispatchOperationRuntime.InvokeBegin(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage5(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage4(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage3(MessageRpc& rpc) 
    at System.ServiceModel.Dispatcher.ImmutableDispatchRuntime.ProcessMessage2(MessageRpc& rpc) 

回答

1

我知道這是一個老問題,但你得到了打開會話在View模塊中你的web.config文件中定義?

對於IIS6,它應該是這樣的:

<httpModules> 
    <!-- Other modules here --> 
    <add name="OpenSessionInView" type="Spring.Data.NHibernate.Support.OpenSessionInViewModule, Spring.Data.NHibernate21"/> 
</httpModules> 

而且,我可能是錯誤的這一點,但我想打開會話在瀏覽查找名爲會話工廠(你已經猜到了)的SessionFactory ,&因此您可能還需要將此添加到web.config中:

<appSettings> 
    <!-- Other App Settings --> 
    <add key="Spring.Data.NHibernate.Support.OpenSessionInViewModule.SessionFactoryObjectName" value="NHibernateSessionFactory"/> 
</appSettings> 
相關問題