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对属性的访问策略;

  • 相关阅读:
    Java 基础
    Java 数据类型
    Spring 拦截器实现事物
    SSH 配置日记
    Hibernate 知识提高
    Jsp、Servlet
    leetcode 97. Interleaving String
    leetcode 750. Number Of Corner Rectangles
    leetcode 748. Shortest Completing Word
    leetcode 746. Min Cost Climbing Stairs
  • 原文地址:https://www.cnblogs.com/cwy173/p/2378192.html
Copyright © 2011-2022 走看看