• Nhibernate3循序渐进(二): 基本映射和复合主键


    1. 基本映射常用标签

        作为NHibernate这个ORM框架来说:

        一个实体类对应的是数据库中的一张表;

        类中的一个属性对应表中的一个字段;

        一个对象对应的是表中的一条记录。

      1.1 hibernate-mapping

      <hibernate-mapping>标签是NHibernate映射文件的根节点。

      <hibernate-mapping                                  
           schema="schemaName"                         数据库schema名称。

             default-cascade="none|save-update"      默认的级联风格,(可选 - 默认为 none):。

             auto-import="true|false"              指定我们在使用查询语句的时候是否可以使用非全限定名。  

             assembly="AssemblyName"                                  

             namespace="Namespace"             指定映射文件中的类的应用程序集名称和其所在的名称空间名,

                                                                         用来生成类的非全限定名。        

      />

      1.2 class

      <class>标签定义一个持久化类

      <class                                               
            name="ClassName"                              持久化类的类名,这里可以是类的全名。
            table="tableName"                             对应的数据库表名。
            discriminator-value="discriminator_value"     辨别值,一个用于区分不同的子类的值,在多态行为时使用(在后面继承映射的课程中会讲到)。
            mutable="true|false"                          表明该类的实例可变。
            schema="owner"                                覆盖在根元素中指定的schema名字。
            proxy="ProxyInterface"                        指定一个接口,在延迟装载时作为代理使用。你可以在这里使用该类自己的名字。
            dynamic-update="true|false"                   指定用于UPDATE 的SQL将会在运行时动态生成,并且只更新那些改变过的字段。
            dynamic-insert="true|false"                   指定用于 INSERT的 SQL 将会在运行时动态生成,并且只包含那些非空值字段。
            select-before-update="true|false"             指定NHibernate除非确定对象的确被修改了,UPDATE操作。
            polymorphism="implicit|explicit"              界定是隐式还是显式的使用查询多态。
            where="arbitrary sql where condition"         指定一个附加的SQL WHERE 条件,在抓取这个类的对象时会一直增加这个条件。
            persister="PersisterClass"                    指定一个定制的 IClassPersister。
            batch-size="N"                                指定一个用于根据标识符抓取实例时使用的"batch size"(批次抓取数量),默认值为1。 
            optimistic-lock="none|version|dirty|all"      乐观锁定,决定乐观锁定的策略。
            lazy="true|false"                             是否启用延迟加载。
            abstract="true|false"                         是否为抽象类。
      />

      1.3 id

      <id>标签定义了该属性到数据库表主键字段的映射。

      <id                                             

        name="PropertyName"                                   标识属性的名字。
            type="typename"                                          NHibernate类型的名字
            column="column_name"                                主键字段的名字。
            unsaved-value="any|none|null|id_value"         一个特定的标识属性值,用来标志该实例是刚刚创建的,尚未保存。
            access="field|property|nosetter|ClassName"    NHibernate用来访问属性值的策略。
            <generator class="generatorClass"/>
      </id>

        

      generator:主键生成策略

          NHibernate提供了以下几种生成策略:

     

       

    2. 复合主键 

        2.1 composite-id

      <composite-id>为联合主键。

      

      <composite-id                                                       
            name="PropertyName"                                                           
            class="ClassName"                                               联合主键类的类名
            unsaved-value="any|none"                                  
            access="field|property|nosetter|ClassName">

            <key-property name="PropertyName" type="typename" column="column_name"/>   联合主键的属性
            <key-many-to-one name="PropertyName class="ClassName" column="column_name"/>      联合主键多对一属性
            ......
      </composite-id>

      注意的是,若使用联合主键,你的持久化类必须重载 Equals()GetHashCode()方法

          代码如下:

    Product.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>

    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="NHibernate3.Domain" namespace="NHibernate3.Domain">
      <class name="Product" table="T_Product2" lazy="true" >

        <composite-id name="ID" class="ProductID">
          <key-property name="Name" type="string">
            <column name="Name" length="50"/>
          </key-property>

          <key-property name="QuantityPerUnit" type="string">
            <column name="QuantityPerUnit" length="50"/>
          </key-property>
        </composite-id>

        <property name="Unit" type="string">
          <column name="Unit" length="50"/>
        </property>


        <property name="SellPrice" type="decimal">
          <column name="SellPrice" precision="14" scale="2"/>
        </property>

        <property name="BuyPrice" type="decimal">
          <column name="BuyPrice" precision="14" scale="2"/>
        </property>

        <property name="Remark" type="string">
          <column name="Remark" length="200"/>
        </property>

      </class>
    </hibernate-mapping>

    ProductID.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace NHibernate3.Domain
    {
        public class ProductID
        {
            public virtual string Name { getset; }

            public virtual string QuantityPerUnit { getset; }

            public override bool Equals(object obj)
            {
                var entity = obj as ProductID;
                if (entity == null)
                {
                    return false;
                }

                return entity.Name == this.Name
                    && entity.QuantityPerUnit == this.QuantityPerUnit;
            }

            public override int GetHashCode()
            {
                return base.GetHashCode();
            }
        }
    }

    Product.cs

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace NHibernate3.Domain
    {
        public class Product
        {
            public virtual ProductID ID { getset; }

            public virtual string Unit { getset; }

            public virtual decimal SellPrice { getset; }

            public virtual decimal BuyPrice { getset; }

            public virtual string Remark { getset; }
        }
    }

    运行效果:

    技术改变世界
  • 相关阅读:
    python中logging的使用
    从零到Django大牛的的进阶之路02
    PostgreSQL 输出 JSON 结果
    Hello World
    Node多国语言包
    更改ejs模板引擎的后缀为html
    Node.js 调试小技巧
    JavsScript 一些技巧方法
    如何预测 Pinterest 和 Instagram 的未来发展潜力?
    如何获得div对象的绝对坐标
  • 原文地址:https://www.cnblogs.com/davidgu/p/2550728.html
Copyright © 2020-2023  润新知