2009-05-20 5 views
3

Ich verwende NHibernate in erster Linie gegen eine MSSQL-Datenbank, wo ich MSSQL-Schemata für die verschiedenen Tabellen verwendet haben.NHibernate "Datenbank" Schema Verwirrung [. Hibernate-Mapping @schema]

In meinem NH-Mapping (HBM) Dateien, habe ich das Schema für jede Tabelle in der Abbildung wie folgt angegeben:

<?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> 

Für meine Unit-Tests habe ich mit SQLite experimentiert, aber mein Zuordnungen schlagen fehl, da NH meldet, dass die Datenbank "xyz" nicht gefunden werden kann.

Ich verstehe, es gibt einen Unterschied in der Interpretation von schema, also was ist NH-Interpretation/Implementierung, und was ist der beste Ansatz bei der Verwendung von Schemas?

BTW: Suchen im Web Schlüsselwörter wie "nhibernate Datenbankschema" mit doen't etwas relevant ergab.

+0

Ich verwende derzeit NH 2.0.1 GA. Wenn man jedoch Version 2.1.0 Alpha3 betrachtet, sieht es so aus, als ob das HBM XSD jetzt ein Katalogattribut enthält. Wird weiter untersuchen. – VirtualStaticVoid

Antwort

6

Die "Standard" -Interpretation ist, dass eine Tabelle einen dreiteiligen Namen hat: "CATALOG.SCHEMA.TABLE": Dies sind die Namen, die in den Standardansichten (ISO-SQL-Standard?) "Information_schema" verwendet werden. Hibernate (vermutlich auch NHibernate) folgt dieser Konvention. Sie können den Katalog und das Schema in einer Klassenzuordnung und default_catalog und default_schema in einer Konfiguration angeben.

In meiner eigenen Komponententestumgebung (mit Hypersonic) massierte ich die Hibernate-Konfiguration vor dem Erstellen der SessionFactory: Ich habe dies getan, um HSQL-kompatible IdentifierGenerators zu setzen, aber Sie können die Schemaeigenschaften von die zugeordneten Klassen.

Im Allgemeinen versuche ich, Schemata und Kataloge in Anwendungen zu vermeiden, überhaupt angeben. In Oracle erstelle ich normalerweise Synonyme, damit Benutzer die Objekte in ihrem eigenen Namensraum sehen; Stellen Sie in PostgreSQL den Suchpfad in der Datenbankkonfiguration ein. Platzieren Sie in SQL Server alle Tabellen in "Dbo".

1

Die NHibernate.Mapping.Table Klasse hat eine GetQualifiedName(NHibernate.Dialect.Dialect dialect) Methode, die wie folgt definiert ist:

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

So gibt es im Grunde keine Möglichkeit, Sie SQLite machen können andere Schemanamen zu ignorieren, als für jedes Szenario einen separaten Satz von Zuordnungen zu haben (oder vor der Kompilierung vorverarbeiten).

1

Sie das Schema angeben können (wenn Sie es brauchen) in der Konfigurationsdatei Eigenschaft default_schema. Sie können mehrere Konfigurationsdateien verwenden oder die von Ihnen verwendete ändern - eine für die Produktion und die andere für den Test.

Es ist möglich, dass Sie einfach das Schema Einstellung und andere Anmeldeinformationen verwenden, ignorieren können.