2011-02-09 6 views
1

ASP .NET MVC와 함께 Spring .NEt와 NHibernate를 사용하고있다.NHibernate Spring .NET은 트랜잭션 프록시에 조언을 추가한다.

최근 트랜잭션 관리를 Spring과 통합하기로 결정했습니다. Spring이 서비스의 [Transaction()] 속성을 사용하여 쉽게 변환을 통합하는 방법을 제공한다는 것을 이해합니다. 이 일을해야 해.

이전 아키텍처는 AOP를 사용하여 조언을 통해 서비스 호출을 가로 채고이 메서드를 호출 할 수 있는지 확인했습니다.

CALL -> Tx Advice -> 사용 권한 조언 -> 서비스 -> 논리 실행 -> Tx Advice에서 커밋/롤백 Tx -> 종료 CALL.

이제 서비스 메서드의 Transaction() 특성 때문에 Tx 권고가 더 이상 필요하지 않습니다.

그러나 PermissionAdvice를 만들기 전에 트랜잭션이 시작되도록하려면 어떻게해야합니까?

파일 : services.xml의

<object id="BusinessLogicServiceBase" type="Winito.Server.Services.Impl.BusinessLogicService, Winito.Server"> 
<property name="ObjectPersistenceManager" ref="ObjectPersistenceManager" /> 
<property name="StatisticsStandingsManager" ref="StatisticsStandingsManager" /> 

.... 
</object> 

<tx:attribute-driven/> 

파일 : Dao.xml

기존 코드

<object type="Spring.Objects.Factory.Config.PropertyPlaceholderConfigurer, Spring.Core"> 
<property name="ConfigSections" value="databaseSettings"/> 
</object> 

<!-- Database and NHibernate Configuration --> 
<!-- SqlServer-2.0 --> 
<db:provider id="DbProvider" provider="System.Data.SqlClient" connectionString=""     /> 

<!-- NHibernate Configuration --> 
<object id="NHibernateSessionFactory" type="Winito.Data.Base.NHibernate.CustomLocalSessionFactoryObject, Winito.Data.Base"> 
<property name="DbProvider" ref="DbProvider"/> 
<property name="MappingAssemblies"> 
<list> 
<value>Winito.Core</value> 
    </list> 
</property> 
<property name="HibernateProperties"> 
    <dictionary> 
    <entry key="connection.provider" value="NHibernate.Connection.DriverConnectionProvider" /> 
    <entry key="use_proxy_validator" value="false" /> 
    <entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/> 
    <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver" /> 
    <entry key="connection.isolation" value="ReadCommitted" /> 
    <!--<property name="cache.provider_class">NHibernate.Caches.SysCache.SysCacheProvider,NHibernate.Caches.SysCache</property>--> 
    <!--<property name="cache.use_second_level_cache">true</property>--> 
    <entry key="command_timeout" value="340" /> 
    <entry key="use_outer_join" value="true" /> 
    <entry key="proxyfactory.factory_class" value="NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle" /> 
    </dictionary> 
</property> 

<!-- provides integation with Spring's declarative transaction management features --> 
<property name="ExposeTransactionAwareSessionFactory" value="true" /> 
</object> 

<!-- Transaction Management Strategy - local database transactions --> 
<object id="transactionManager"  type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate30"> 

<property name="DbProvider" ref="DbProvider"/> 
<property name="SessionFactory" ref="NHibernateSessionFactory"/> 

</object> 

<!-- Exception translation object post processor --> 
<object type="Spring.Dao.Attributes.PersistenceExceptionTranslationPostProcessor, Spring.Data"/> 
: declarative transaction management에 봄 문서에서

<object id="BusinessLogicService" type="Spring.Aop.Framework.ProxyFactoryObject"> 
<property name="target" ref="BusinessLogicServiceBase" /> 
<property name="interceptorNames"> 
    <list> 
    <!-- <value>TimingAdvice</value> --> 
    <value>TransactionalAdvice</value> 
    <value>PermissionAdviceBusinessLogic</value> 
    </list> 
</property> 
</object> 

답변

0

, 나는 당신이 할 수있는 것을 읽어 attribute-driven tag에 주문 요소를 지정하십시오. 주문

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

값과 같은

뭔가가 aop advice ordering에 대한 일반 규칙에 사용됩니다.

관련 문제