2009-05-20 12 views
3

私は、主にMSSQLデータベースに対して、私はさまざまなテーブルのためのMSSQLスキーマを使用してNHibernateを使用しています。私のNHマッピング(HBM)ファイルで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はデータベース "xyz"が見つからないと報告しているので、マッピングは失敗します。

私はschemaの解釈に違いがあることを理解していますので、NHの解釈/実装とは何ですか?また、スキーマを使用するときの最良のアプローチは何ですか?

BTW:「nhibernateデータベーススキーマ」のようなキーワードを使用してウェブを検索すると、何か関連性がありません。

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

だから基本的にはすべてのシナリオのマッピングの別のセットを持っているよりも、あなたが他のスキーマ名を無視するのSQLiteを作ることができる方法はありません。

+0

現在、NH 2.0.1 GAを使用しています。バージョン2.1.0のAlpha3を見ると、HBM XSDにカタログ属性が追加されたようです。 さらに調査します。 – VirtualStaticVoid

答えて

6

"標準"解釈は、テーブルに3つの部分からなる名前があることです。 "CATALOG.SCHEMA.TABLE":これらは標準(ISO-SQL標準?)の "information_schema"ビューで使用される名前です。 Hibernate(おそらくNHibernate)もこの規約に従います。クラスマッピングではカタログとスキーマを、設定ではdefault_catalogとdefault_schemaを指定できます。

私自身のユニットテスト環境(Hypersonicを使用しています)では、SessionFactoryを構築する前にHibernate Configurationをマッサージしました。私はこれを使ってHSQL互換のIdentifierGeneratorsを設定しましたが、あなたはスキーマプロパティをクリアすることができます。マッピングされたクラス

一般に、アプリケーションではスキーマやカタログを指定しないようにしています。 Oracleでは、一般に同義語を作成するため、ユーザーは自分の名前空間にあるオブジェクトを参照できます。 PostgreSQLでは、データベース設定でsearch_pathを設定します。 SQL Serverで、すべてのテーブルを 'dbo'に入れます。

1

NHibernate.Mapping.Tableクラスは、次のように定義されてGetQualifiedName(NHibernate.Dialect.Dialect dialect)方法を、持っています(またはコンパイルする前にそれらを前処理する)。

1

プロパティファイルdefault_schemaを使用して、構成ファイルにスキーマ(必要な場合)を指定できます。複数の構成ファイルを使用することも、使用しているものを変更することもできます.1つは本番用、もう1つはテスト用です。

スキーマの設定を無視して、異なる資格情報を使用することは可能です。