2015-04-01 36 views
0

我試圖從Spring.Net 1.3.2,NHibernate 3.2到Spring.Net 2,NHibernate 4升級項目。Spring.Net 2,NHibernate 4錯誤「無法從字符串值加載類型'Spring.Data.NHibernate.LocalSessionFactoryObject,Spring.Data.NHibernate'。」

我得到錯誤「無法從字符串值加載類型'Spring.Data。 NHibernate.LocalSessionFactoryObject,Spring.Data.NHibernate'。「當我嘗試跑步時。

我的日誌顯示:

System.Configuration.ConfigurationErrorsException: Error creating context 'spring.root': Could not load type from string value 'Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate'. ---> Spring.Objects.Factory.ObjectCreationException: Error thrown by a dependency of object 'transactionAdvisor' defined in 'file [C:\Users\...\Project.Web\Config\transaction.aop.xml] line 7' : Initialization of object failed : Cannot resolve type [Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate] for object with name 'transactionManager' defined in file [C:\Users\...\Project.Web\Config\hibernate.cfg.xml] line 45 
while resolving 'TransactionInterceptor' to 'transactionInterceptor' defined in 'file [C:\Users\...\Project.Web\Config\transaction.aop.xml] line 12' ---> Spring.Core.CannotLoadObjectTypeException: Cannot resolve type [Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate] for object with name 'transactionManager' defined in file [C:\Users\...\Project.Web\Config\hibernate.cfg.xml] line 45 ---> System.TypeLoadException: Could not load type from string value 'Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate'. 
    at Spring.Core.TypeResolution.TypeResolver.Resolve(String typeName) in c:\_prj\spring-net\src\Spring\Spring.Core\Core\TypeResolution\TypeResolver.cs:line 81 

如果我只是打開一個CS文件並創建一個Spring.Data.NHibernate.LocalSessionFactoryObject它看起來不錯,和命名空間是正確的。 由於版本更改,我確實更改了參考。這是我現在有:

transaction.aop.xml

<object id="transactionAdvisor" type="Spring.Transaction.Interceptor.TransactionAttributeSourceAdvisor, Spring.Data"> 
     <property name="TransactionInterceptor" ref="transactionInterceptor"/> 
    </object> 

    <!-- Transaction Interceptor --> 
    <object id="transactionInterceptor" type="Spring.Transaction.Interceptor.TransactionInterceptor, Spring.Data"> 
     <property name="TransactionManager" ref="transactionManager"/> 
     <property name="TransactionAttributeSource" ref="attributeTransactionAttributeSource"/> 
    </object> 

    <object id="attributeTransactionAttributeSource" type="Spring.Transaction.Interceptor.AttributesTransactionAttributeSource, Spring.Data"> 
    </object> 

的hibernate.cfg.xml

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

<db:provider id="DbProvider" provider="SqlServer-2.0" connectionString="Data Source=${db.datasource};Database=${db.database};User ID=${db.user};Password=${db.password};Connect Timeout=${db.connectTimeout}"/> 

<object id="hibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate"> 
    <property name="DbProvider" ref="DbProvider"/> 
    <property name="MappingAssemblies"> 
     <list> 
      <value>IBB.BusinessNet.Services</value> 
     </list> 
    </property> 
    <property name="HibernateProperties"> 
     <dictionary> 
      <entry key-ref="connection.provider" value-ref="NHibernate.Connection.DriverConnectionProvider"/> 
      <entry key-ref="show_sql" value-ref="false"/> 
      <entry key-ref="dialect" value-ref="NHibernate.Dialect.MsSql2008Dialect"/> 
      <entry key-ref="connection.driver_class" value-ref="NHibernate.Driver.SqlClientDriver"/> 
      <entry key-ref="connection.pool_size" value-ref="10"/> 
      <entry key-ref="query.substitutions" value-ref="true 1, false 0, yes 'Y', no 'N'"/> 
      <entry key-ref="use_outer_join" value-ref="true"/> 
      <entry key-ref="command_timeout" value-ref="840" /> 
      <entry key-ref="cache.provider_class" value-ref="NHibernate.Caches.SysCache2.SysCacheProvider,NHibernate.Caches.SysCache2" /> 
     </dictionary> 
    </property> 
    <property name="ExposeTransactionAwareSessionFactory" value="true" /> 
</object> 

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

<object id="MyHibernateTemplate" type="Spring.Data.NHibernate.Generic.HibernateTemplate"> 
    <property name="SessionFactory" ref="hibernateSessionFactory" /> 
    <property name="TemplateFlushMode" value="Auto" /> 
    <property name="AllowCreate" value="true" /> 
    <property name="CacheQueries" value="true" /> 
</object> 

<object id="HibernateTemplate" type="Spring.Data.NHibernate.HibernateTemplate"> 
    <property name="SessionFactory" ref="hibernateSessionFactory" /> 
    <property name="TemplateFlushMode" value="Auto" /> 
    <property name="AllowCreate" value="true" /> 
    <property name="CacheQueries" value="true" /> 
</object> 

當然所有的東西都消毒和修剪,以減少空間。我沒有更改映射hbm文件,因爲我沒有發現任何說我應該。

我敲開了Spring日誌到DEBUG,修復了一些問題。將NHibernate更改爲DEBUG不會添加任何日誌記錄,因爲它沒有達到那麼遠。春天加載一切正常。 hibernate.cfg.xml輸出DEBUG消息,其中包含「忽略對象X的對象類加載失敗」,它們全都是 「無法從字符串值加載類型」。 第一個錯誤是「GetObjectInternal:錯誤獲取對象transactionManager」。

我已經把頭撞在牆上數小時,試圖找出原因。我知道有些人比我更瞭解這些東西,並且可以指引我朝着正確的方向前進,所以這裏是我的求助呼籲。

回答

1

Bah,我一直想使用命名空間而不是程序集名稱。 hibernate.cfg.xml中的2行需要是DLL的名稱。

<object id="hibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate4"> 

... 

<object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate4"> 
+0

你應該接受你自己的答案,因爲這是解決方案! – 2015-07-18 11:21:28

相關問題