2011-02-09 4 views
1

私は、ASP.NET MVCと共にSpring .NEtとNHibernateを使用しています。NHibernate Spring .NETはトランザクションプロキシへのアドバイスを追加します

最近、私はSpringとのトランザクション管理を統合することに決めました。私はSpringがあなたのサービスの[Transaction()]属性を使って容易に変換を統合する方法を理解しています。私はこれを働かせる。

私の古いアーキテクチャは、AOPを使ったアドバイスによってサービスへの呼び出しを傍受し、このメソッドを呼び出すことが許可されているかどうかを確認することでした。

CALL - > Txアドバイス - >許可アドバイス - >サービス - >ロジックの実行 - > Txアドバイスのコミット/ロールバックTx - >終了CALL。

サービスメソッドのTransaction()属性のためにTx Adviceが不要になりました。

ただし、トランザクションを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の通常の規則で使用されています。