Spring.Net 2, ошибка NHibernate 4 "Не удалось загрузить тип из строкового значения" Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate "."
Я пытаюсь обновить проект с Spring.Net 1.3.2, NHibernate 3.2 до Spring.Net 2, NHibernate 4.
Я получаю сообщение об ошибке "Не удалось загрузить тип из строкового значения" 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: ошибка при получении объекта actionManager".
Я часами бился головой о стену, пытаясь понять, почему. Я знаю, что есть люди, которые понимают это лучше меня и могут указать мне правильное направление, так что вот мой призыв о помощи.
1 ответ
Бах, я все еще хочу использовать пространство имен, а не имя сборки. 2 строки в hibernate.cfg.xml должны быть именами DLL.
<object id="hibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate4">
...
<object id="transactionManager" type="Spring.Data.NHibernate.HibernateTransactionManager, Spring.Data.NHibernate4">