2009-05-20 2 views
3

Я использую NHibernate в основном против базы данных MSSQL, где я использовал схемы MSSQL для разных таблиц.NHibernate «database» schema confusion [. Hibernate-mapping @schema]

В моем отображении NH (HBM) файлы, я указал схему для каждой таблицы в отображении следующим образом:

<?xml version="1.0"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        auto-import="true" 
        schema="xyz">     <!-- schema specified --> 
    <class name="Customer"> 
    <id name="Id"> 
     <generator class="native" /> 
    </id> 
    <property name="Name" /> 
    </class> 
</hibernate-mapping> 

Для моего модульного тестирования, я экспериментировал с SQLite, однако мои сопоставления теперь не отображаются, поскольку NH сообщает, что база данных «xyz» не найдена.

Я понимаю, что существует разница в интерпретации schema, так что же такое интерпретация/реализация NH и какой лучший подход при использовании схемы?

BTW: Поиск в Интернете с использованием таких ключевых слов, как «схема базы данных nhibernate», не давал ничего соответствующего.

+0

В настоящее время я использую NH 2.0.1 GA. Однако, глядя на версию 2.1.0 Alpha3, кажется, что HBM XSD теперь включает атрибут каталога. Будет исследовать далее. – VirtualStaticVoid

ответ

6

«Стандартная» интерпретация состоит в том, что таблица имеет трехзначное имя: «CATALOG.SCHEMA.TABLE»: это имена, используемые в стандартном (стандартном стандарте ISO-SQL?) «Information_schema». Hibernate (предположительно также NHibernate) следует этому соглашению, вы можете указать каталог и схему в сопоставлении классов, а default_catalog и default_schema в конфигурации.

В моей собственной тестовой среде (с использованием Hypersonic), я массировал конфигурацию Hibernate перед созданием SessionFactory: я сам делал это так же, как настройка HSQL-совместимых IdentifierGenerators, но вы можете с вероятностью пройти очистку свойств схемы сопоставленные классы.

В общем, я стараюсь избегать указания схем и каталогов в приложениях вообще. В Oracle я обычно создаю синонимы, чтобы пользователи видели объекты в своем собственном пространстве имен; в PostgreSQL, установите путь поиска в конфигурации базы данных; в SQL Server поместите все таблицы в «dbo».

1

NHibernate.Mapping.Table класс имеет GetQualifiedName(NHibernate.Dialect.Dialect dialect) метод, который определяется следующим образом:

public string GetQualifiedName(NHibernate.Dialect.Dialect dialect) 
{ 
    string quotedName = this.GetQuotedName(dialect); 
    return ((this.schema == null) ? 
     quotedName : 
     (this.GetQuotedSchemaName(dialect) + '.' + quotedName)); 
} 

Так что нет в принципе никакого способа, вы можете сделать SQLite игнорировать имя схемы, кроме иметь отдельный набор отображений для каждого сценария (или предварительной обработки их перед компиляцией).

1

Вы можете указать схему (если она вам понадобится) в файле конфигурации, используя свойство default_schema. Вы можете использовать несколько файлов конфигурации или изменить тот, который вы используете, - один для производства, а другой для теста.

Возможно, вы можете просто проигнорировать настройку схемы и использовать разные учетные данные.