zoukankan      html  css  js  c++  java
  • NHibernate配置文件和映射文件的详解

    Hibernate-mapping映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。

    NHiberbate的基本构成接口: 

    ISession
    ISession是面向用户的主要接口,主要用于对象持久化,数据加载等操作,支持数据库事务,它隐藏了NHB内部复杂的实现细节,ISession由ISessionFactory创建。

    ISessionFactory
    ISessionFactory是NHB内部的核心类,它维护到持久机制(数据库)的连接并对它们进行管理,同时还会保存所有持久对象的映射信息。
    ISessionFactory由Configuration创建,因为创建ISessionFactory的开销非常大(需要加载映射信息),所以这个对象一般使用Singleton(单例)模式。

    ITransaction
    ITransaction是NHB的事务处理接口,它只是简单的封装了底层的数据库事务。
    事务必须由ISession来启动。

    ICriteria
    ICriteria是Expression(表达式)数据加载接口,Expression是一个关系表达式组合,通过它能产生SQL语句的Where部分, 用户需要通过ISession来间接调用它。

    IQuery
    IQuery是HQL数据加载接口,HQL(Hibernate Query Language)是NHB专用的面向对象的数据查询语言,它与数据库的SQL有些类似,但功能更强大!同ICriteria一样,也需要通过ISession来间接调用它。

    下面是配置文件和映射文件的详解:

    NHibernate是通过映射文件,将数据表中的记录转化为对象,将记录中的字段转化为对象的属性,所以说映射文件是O/R映射中至关重要的一个环节,下面就对其进行详细的讲解说明。

      1 <?xml version="1.0" ?>

     2 <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0" namespace="Eg" assembly="Eg">
     3           <class name="Cat" table="CATS" discriminator-value="C">
     4                     <id name="Id" column="uid" type="Int64">
     5 <generator class="hilo"/>
     6                     </id>
     7                     <discriminator column="subclass" type="Char"/>
     8                     <property name="Birthdate" type="Date"/>
     9                     <property name="Color" not-null="true"/>
    10                     <property name="Sex" not-null="true" update="false"/>
    11                     <property name="Weight"/>
    12                     <many-to-one name="Mate" column="mate_id"/>
    13                     <set name="Kittens">
    14                                <key column="mother_id"/>
    15                                <one-to-many class="Cat"/>
    16                     </set>
    17                     <subclass name="DomesticCat" discriminator-value="D">
    18                                <property name="Name" type="String"/>
    19                     </subclass>
    20           </class>
    21           <class name="Dog">
    22                     <!-- mapping for Dog could go here -->
    23           </class>
    24 </hibernate-mapping>

     映射文件中不仅描述了NHibernate在运行时需要使用到的元素类型和属性,同时还包含了额外的元素属性,如被映射字段是否允许为空等。

    Schema

    NHibernate中所使用的所有映射文件均使用nhibernate-mapping-2.0 schemaNHibernate会把这种Schema作为嵌入资源使用。

    Hibernate-mapping

     1 <hibernate-mapping

    2 
    3           schema="schemaName" (1)
    4           default-cascade="none|save-update" (2)
    5           auto-import="true|false" (3)
    6           default-access="property|field|nosetter|ClassName" (4)
    7           assembly="assembly.name" (5)
    8           namespace="namespace.name" (6)
    9 >

     

    这个元素有六个可选属性。

    Schema(可选) :数据表结构名称;

    (1)     Default-cascade(可选,默认值为none) :数据表级联类型;

    (2)     Auto-import(可选,默认值true) :指示出是否可以在查询语句中不指定类名;

    (3)     Default-access(可选,默认值为”property”):指示出NHibernate用于访问字段的策略;

    (4)     Assemble(可选):如果在引用实体类时没有指明类名前缀,则用此选项值作为默认的类名前缀;

    (5)     Namespace(可选):指示同名称空间;

        如果你有两个同名的被持久化的对象(classname相同),则必须将”auto-import” 选项值设为false,否则当你访问这个对象时NHibernate会抛出一个异常。

    Class

      1 <class

     2 
     3           name="ClassName" (1)
     4           table="tableName"(2)
     5           discriminator-value="discriminator_value"(3)
     6           mutable="true|false"(4)
     7           schema="owner"(5)
     8           proxy="ProxyInterface"(6)
     9           dynamic-update="true|false"(7)
    10           dynamic-insert="true|false"(8)
    11           polymorphism="implicit|explicit"(9)
    12           where="arbitrary sql where condition"(10)
    13           persister="PersisterClass"(11)
    14           lazy="true|false"(12)
    15 />

      

    (1)     name:持久类在.Net中的类型的的全名及其所在程序集;

    (2)     table:数据库中的数据表名称;

    (3)     discriminator-value(可选,默认值为类名):用于区分单独的子集,使用与多态形式;

    (4)     mutable(可选,默认值为true):指定类实例是否易变;

    (5)     schema(可选):重新指定hibernate-mapping中的Schema选项值;

    (6)     proxy(可选):指定用于实现惰性初始的接口,如果所有属性都被声明为Virtual,则可以将类名指定给此选项;

    (7)     dynamic-update(可选,默认值false):指示出NHibernate在运行时产生的Update SQL语句是否仅包含被修改了的字段;

    (8)     dynamic-insert(可选,默认值false):指示出NHibernate在运行时产生的Insert  SQL语句是否仅包含被值不为Null的字段;

    (9)     polymorphism(可选,默认值implict):指示出是否需要有确指明查询是否使用多态性;

    (10)  where(可选):指定Where SQL语句可以获取这个类类型的对象;

    (11)  persister(可选):指定用户自定义的IClassPersister

    (12)  lazy(可选):将此项设为true等同与将它自己的类名赋予给proxy选项。

     

    Id

    被映射的类必须声明一个Id与数据表中的主键相对应。Id其实也是被映射的类的一个属性,与使用Proerpty声明的属性不同的是ID属性值必须是唯一的,通过ID可以将对象转化为数据表中唯一的一条记录,同样也可以将数据表中的记录转化为对象。

    1 <id
    2           name="propertyName" (1)
    3           type="typename" (2)
    4           column="column_name" (3)
    5           unsaved-value="any|none|null|id_value" (4)
    6           access="field|property|nosetter|ClassName"> (5)
    7           <generator class="generatorClass"/>
    8 </id>   

    (1)     name(可选):属性的名称;

    (2)     type(可选):属性的类型;

    (3)     column(可选,默认值和属性名称相同):数据表中的主键字段名称,如果用户定义的属性名称和此字段名称相同,则此选项可忽略不写;

    (4)     unsaved-value(可选,默认值为null):为属性指定默认值,当用户创建一个新的实例时,会将该选 项值做为属性默认值;

    (5)     access(可选,默认为”property”)NHibernate对属性的访问策略;

     

    Generator

    此节指定了用于为该持久类实例产生ID属性值的.Net数据类型。如果需要一些参数对产生类实例ID属性值的数据类型进行配置或是初始化工作,可以使用”Param” 子节对其进行定义。

    1 <id name="Id" type="Int64" column="uid" unsaved-value="0">
    2           <generator class="NHibernate.Id.TableHiLoGenerator">
    3                     <param name="table">uid_table</param>
    4                     <param name="column">next_hi_value_column</param>
    5           </generator>
    6 </id>
     

    所有的ID属性值产生器均实现了Nhibernate.Id.IdentifierGenerator接口。这是一个很简单的接口,一些应用程序会有他们自已专门的ID属性值产生器。尽量这样,NHibernate仍提供了一些内置的ID属性值产生器,下面对其简单说明。

    Identity

    支持DB2MySQLMS SQL ServerSybaseHpersonicSQL数据库中的自增字段。会产生类型为Int64Int32或是Int16的整型数值。

     

    Sequence

    使用DB2, PostgreSQL, Oracle数据库中的序列。会产生类型为Int64Int32或是Int16的整型数值。

     

    Hilo

    使用Hi/lo算法有效的产生一个类型为Int64Int32或是Int16的整型数值。

     

    Guid

    使用.Net平台下的new System.Guid产生一个唯一的序列值。

     

    Assigned

    让应用程序在将此类持久化到数据库之前,对ID属性指定一个值。

     

    Property

    利用Property可以将数据表中的字段映射为持久类的属性。

     1 <property
     2 
     3           name="propertyName"(1)
     4           column="column_name"(2)
     5           type="typename"(3)
     6           update="true|false"(4)
     7           insert="true|false"(5)
     8           formula="arbitrary SQL expression"(6)
     9           access="field|property|nosetter|ClassName"(7)
    10 />

          (1)     name:要映射成的属性名称;

    (2)     column(可选,默认和name值相同):数据表中的字段名称;

    (3)     type(可选):指定属性类型;

    (4)     update(可选,默认值为true):是否将此属性包含到NHibernate产生的Update SQL子句中;

    (5)     insert(可选,默认值为true):是否将此属性包含到NHibernate产生的Insert SQL子句中;

    (6)     formula(可选):用于计算该属性值的一个SQL表达式。计算属性没有在数据表中没有相应的字段与其对应;

    (7)     access(可选,默认为”property”)NHibernate对属性的访问策略;

  • 相关阅读:
    显因子模型简介
    关联规则中最小支持度和最小置信度
    Matlab读取音频数据
    初识禁忌搜索算法
    Word中将图表变为表格
    明尼苏达推荐系统导论(第一课 欢迎来到RS)
    python复杂网络分析库NetworkX
    python使用zlib实现压缩与解压字符串
    PostgreSQL 对字段大小写敏感
    pycharm快捷键及一些常用设置
  • 原文地址:https://www.cnblogs.com/cwy173/p/2378192.html
Copyright © 2011-2022 走看看