NHibernate“数据库”模式混淆[。\ hibernate-mapping \ @schema]

时间:2009-05-20 12:24:38

标签: nhibernate schema nhibernate-mapping mapping

我正在使用NHibernate主要针对MSSQL数据库,我在那里使用MSSQL模式用于各种表。

在我的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数据库模式”等关键字搜索网络并没有产生任何相关内容。

3 个答案:

答案 0 :(得分: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 :(得分: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忽略模式名称,除了为每个场景设置一组单独的映射(或在编译之前预处理它们)。

答案 2 :(得分:1)

您可以使用属性default_schema在配置文件中指定架构(如果需要)。您可以使用多个配置文件,或者更改您正在使用的配置文件 - 一个用于生产,另一个用于测试。

您可以简单地忽略架构设置并使用不同的凭据。