2010-02-22 2 views
4

내 데이터 계층에 spring.net과 nihibernate를 사용하려고합니다.NHibernate가있는 Spring.net과 "스레드 오류에 바인드 된 최대 절전 세션이 없음"

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

이 코드는 내가 다음과 같은 오류 얻을 호출 될 때마다 :

나는 다음과 같은 코드를 포함하는 간단한 DAO 객체가

가 "아니오 최대 절전 모드 세션 스레드에 바인딩하지를, 및 구성 여기서 비 트랜잭션 (non-transactional) 객체를 만들 수 없습니다. "

내 DAO 계층은 다음과 같은 구성을 가지고 있습니다. Web.config의 :

내가 파서에 대한 참조 포함 시켰 내 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> 

:

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

및 어셈블리 리소스로 내 dao.xml을 참조.

이 DOA는 저장이 호출 된 다른 스프링 구성 개체에 주입됩니다.

내가 잘못하고있는 아이디어가 있습니까? 당신은 내가 봄 코드에 부착 된 설정

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

을 포함하여 내가 볼과에 TransactionInterceptor의 invoke 메소드에 중단 점을 배치 할 수 있습니다으로 - 그것은라는 결코 극복 - 그래서 아마도 프록시 밤은 내 DAO를 생성하고 사물? 여기

전체 스택 추적입니다 :

<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

나는이 오래된 질문 알아요,하지만 당신은 당신의 web.config 파일에 정의 된보기 모듈에서 열기 세션을 가지고있다? 또한

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

, 이것에 대해 잘못 될 수도 있지만, 내가보기에서 열려 세션라는 이름의 세션 팩토리 (당신이 그것을 짐작) SessionFactory를 찾습니다 생각 :

IIS6의 경우, 같은 것을해야한다 , &이므로 web.config에도이 값을 추가해야합니다.

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