2009-05-20 26 views
3

我使用NHibernate主要針對MSSQL數據庫,其中我使用MSSQL模式爲各種表。但是我NHibernate的「數據庫」模式混淆[。 hibernate-mapping @schema]

<?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映射(HBM)的文件,我指定每個表的架構在映射如下由於NH報告無法找到數據庫「xyz」,現在映射失敗。

據我所知,schema的解釋有所不同,那麼NH的解釋/實現是什麼,以及使用模式的最佳方法是什麼?

順便說一句:使用像「nhibernate數據庫模式」這樣的關鍵字搜索網站不會產生任何相關的結果。

+0

我目前使用NH 2.0.1 GA。然而,看看版本2.1.0 Alpha3,看起來HBM XSD現在包含一個目錄屬性。 將進一步調查。 – VirtualStaticVoid 2009-05-20 20:48:49

回答

6

「標準」解釋是一個表由三部分組成的名稱:「CATALOG.SCHEMA.TABLE」:這些是在標準(ISO-SQL標準?)「information_schema」視圖中使用的名稱。 Hibernate(大概也是NHibernate)遵循這個約定,你可以在類映射中指定目錄和模式,在配置中指定default_catalog和default_schema。在我自己的單元測試環境(使用Hypersonic)中,我在構建SessionFactory之前先處理了Hibernate配置:我自己這樣做是爲了設置與HSQL兼容的IdentifierGenerators,但您可以通過清除映射的類。

通常,我儘量避免在應用程序中指定模式和目錄。在Oracle中,我通常會創建同義詞,以便用戶在自己的名稱空間中查看對象;在PostgreSQL中,在數據庫配置中設置search_path;在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在配置文件中指定模式(如果需要的話)。您可以使用多個配置文件,或更改您正在使用的一個 - 一個用於生產,另一個用於測試。

您可以簡單地忽略模式設置並使用不同的憑據。