LocalSessionFactoryObject - MappingResources - Путь к файлу hbm - PullRequest
2 голосов
/ 19 марта 2012

Структура проекта:

enter image description here

Теперь я пытаюсь создать компонент NHibernateSessionFactory как:

<object id="NHibernateSessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate32">
    <property name="DbProvider" ref="DbProvider"/>
    <property name="MappingResources">
    <list>
        <value>EMSApplication.Domain/EMSApplication.hbm.xml</value>
    </list>
    </property>
    <property name="HibernateProperties">
    <dictionary>
        <entry key="hibernate.connection.provider" value="NHibernate.Connection.DriverConnectionProvider"/>
        <entry key="dialect" value="NHibernate.Dialect.MsSql2008Dialect"/>
        <entry key="connection.driver_class" value="NHibernate.Driver.SqlClientDriver"/>
        <entry key="proxyfactory.factory_class" value="NHibernate.Bytecode.DefaultProxyFactoryFactory, NHibernate"/>
        <entry key="show_sql" value="true"/>
        <entry key="hbm2ddl.auto" value="update"/>
        <entry key="cache.use_query_cache" value="true"/>
    </dictionary>
    </property>

    <property name="ExposeTransactionAwareSessionFactory" value="true" />
</object>

Но я получаю сообщение об ошибке:

Error creating context 'spring.root': file [C:\Program Files (x86)\Common Files\Microsoft Shared\DevServer\10.0\EMSApplication.Domain\EMSApplication.hbm.xml] cannot be resolved to local file path - resource does not use 'file:' protocol.

Сейчас проект находится на диске D, мне интересно, почему это указывает на диск C?

Также, как я могу добавить указанный файл hbm в ресурс сопоставления? Этот файл установлен как «Встроенный ресурс».

Можно ли указать здесь каталог для сканирования нескольких файлов hbm?

Любая информация будет очень полезна для меня.

1 Ответ

3 голосов
/ 20 марта 2012

Вы не используете идентификатор протокола (например, file:// или assembly://) в имени ресурса, поэтому Spring использует файловый протокол по умолчанию.Он пытается разрешить файл hbm из того места, где запущено веб-приложение (путь к devserver), , а не , где хранятся его файлы, что, как вы, вероятно, ожидаете.

Для ссылки нафайл на вашем веб-сайте, используйте ~ для определения корня вашего веб-сайта, например, <value>file://~/EMSApplication.Domain/EMSApplication.hbm.xml</value>.Но убедитесь, что файл скопирован, что может быть не так, поскольку вы установили его для встроенного ресурса (почему?).

Рассмотрите следующие улучшения, они сделают вашу жизнь проще:

  • переместите код в ваших папках dao, domain и NHibernate в отдельную сборку (проект библиотеки классов, на которую ссылается ваше веб-приложение) с именем Your.AssemblyName.
  • Фабрика сеансов также поддерживает указание сопоставлений сборок для сканирования, поэтому вам не нужно указывать каждый файл - см. Документацию по , чтобы настроить фабрику сеансов с помощью spring.net .Укажите Your.AssemblyName в списке сборок сопоставления:
<object id="MySessionFactory" type="Spring.Data.NHibernate.LocalSessionFactoryObject, Spring.Data.NHibernate">
  <property name="DbProvider" ref="DbProvider"/>
  <property name="MappingAssemblies">
    <list>
      <value>Your.AssemblyName</value>
    </list>
  </property>
  <property name="HibernateProperties">
  <!-- snip -->
</object>

И посмотрите пример NHibernate в весенних документах - он очень применим к вопросам, которые вы поднимаете здесь.

...