• 映射文件详解(转)


    NHibernate中的映射文件详解

     

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

    NHibernate中的映射文件其实质是一个XML文档。可用使用任何的文本编辑器对其进行编辑操作。

     

    <?xml version="1.0" ?>

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.0"

     namespace="Eg" assembly="Eg">

      <class name="Cat" table="CATS" discriminator-value="C">

        <id name="Id" column="uid" type="Int64">

          <generator class="identity"/>

        </id>

        <discriminator column="subclass" type="Char"/>

        <property name="Birthdate" type="Date"/>

        <property name="Color" not-null="true"/>

        <property name="Sex" not-null="true" update="false"/>

        <property name="Weight"/>

        <many-to-one name="Mate" column="mate_id"/>

        <set name="Kittens">

          <key column="mother_id"/>

          <one-to-many class="Cat"/>

        </set>

        <subclass name="DomesticCat" discriminator-value="D">

          <property name="Name" type="String"/>

        </subclass>

      </class>

      <class name="Dog">

        <!-- mapping for Dog could go here -->

      </class>

    </hibernate-mapping>

     

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

    Schema

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

    Hibernate-mapping

    <hibernate-mapping

        schema="schemaName" (1=""

        default-cascade="none|save-update" (2=""

        auto-import="true|false" (3=""

        default-access="property|field|nosetter|ClassName" (4=""

        assembly="assembly.name" (5=""

        namespace="namespace.name" (6="")

    > 

     

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

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

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

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

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

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

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

     

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

     

    Class

    <class

        name="ClassName" (1=""

        table="tableName"(2=""

        discriminator-value="discriminator_value"(3=""

        mutable="true|false"(4=""

        schema="owner"(5=""

        proxy="ProxyInterface"(6=""

        dynamic-update="true|false"(7=""

        dynamic-insert="true|false"(8=""

        polymorphism="implicit|explicit"(9=""

        where="arbitrary sql where condition"(10=""

        persister="PersisterClass"(11=""

        lazy="true|false"(12="")

    />

     

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

    ·table:数据库中的数据表名称;

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

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

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

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

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

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

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

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

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

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

     

     

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

     

    <id

        name="propertyName" (1=""

        type="typename" (2=""

        column="column_name" (3=""

        unsaved-value="any|none|null|id_value" (4=""

        access="field|property|nosetter|ClassName">(5)

      <generator class="generatorClass"/>

    </id>    

     

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

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

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

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

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

     

    Generator

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

     

    <id name="Id" type="Int64" column="uid" unsaved-value="0">

      <generator class="NHibernate.Id.TableHiLoGenerator">

        <param name="table">uid_table</param>

        <param name="column">next_hi_value_column</param>

      </generator>

    </id>

     

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

     

    <property

        name="propertyName"(1=""

        column="column_name"(2=""

        type="typename"(3=""

        update="true|false"(4=""

        insert="true|false"(5=""

        formula="arbitrary SQL expression"(6=""

        access="field|property|nosetter|ClassName"(7="")

    />

    ·name:要映射成的属性名称;

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

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

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

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

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

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

     

  • 相关阅读:
    [I cannot be cast to java.lang.Comparable
    关于有参构造的调用问题
    方法中的参数问题
    mybatis中xml的sql语句传入参数的不同用的#{}中的参数也不相同
    javaweb中向集合中添加对象报空指针异常问题的可能原因
    找不到log4j类的问题可能的原因
    快速失败和安全失败(别人写的,摘抄过来了)
    自动生成的列在xml中写sql代码插入时不写入,但是其余属性要都列出来
    JQ高级
    JQ初级
  • 原文地址:https://www.cnblogs.com/jams742003/p/1640272.html
Copyright © 2020-2023  润新知