Spring.Net2、NHibernate 4错误"Could not load type from string value 'Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate'."

Spring.Net 2, NHibernate 4 Error "Could not load type from string value 'Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate'."

我正在尝试将项目从 Spring.Net 1.3.2、NHibernate 3.2 升级到 Spring.Net2、NHibernate 4。

我收到错误 "Could not load type from string value '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 它看起来不错,而且名称 space 是正确的。 由于版本更改,我确实更改了引用。这是我现在拥有的:

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>

当然,一切都经过消毒和修剪以减少 space。我没有更改映射 hbm 文件,因为我没有找到任何我应该更改的内容。

我敲了 Spring 登录到 DEBUG,修复了那里的一些问题。将 NHibernate 更改为 DEBUG 不会添加任何日志记录,因为它没有那么远。 Spring 加载其他一切正常。 hibernate.cfg.xml 输出 DEBUG 消息,其中 "Ignoring object class loading failure for object X" 都在说 "Could not load type from string value"。 第一个错误是 "GetObjectInternal: error obtaining object transactionManager".

我已经用头撞墙好几个小时试图找出原因。我知道有些人比我更了解这些东西,可以为我指明正确的方向,所以这是我的求助电话。

糟糕,我一直想使用命名空间而不是程序集名称。 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">