现在的位置: 首页 > 综合 > 正文

知识点 -NHibernate

2012年01月30日 ⁄ 综合 ⁄ 共 5192字 ⁄ 字号 评论关闭

1. 什么是NHibernate 
  NHibernate 是一个面向.NET 环境的对象/关系数据库映射工具。对象关系映射(O/R Mapping,Object Relational Mapping)表示一种技术,用来把对象模型表示的对象映射到基于SQL 的关系模型数据结构中去。
2. NHibernate中的查询方法

  • NHibernate查询语言(HQL,NHibernate Query Language)
  • 条件查询(Criteria API,Query By Example(QBE)是Criteria API的一种特殊情况)
  • 原生SQL(Literal SQL,T-SQL、PL/SQL)

3. NHibernate中的事务

  • NHibernate使用事务要使用using强制资源清理和异常机制

    using (ITransaction tx = _session.BeginTransaction())
    {
        try
        {
            //一些保存、更新、删除等操作
            tx.Commit();
        }
        catch (HibernateException)
        {
            tx.Rollback();
            throw;
        }
    }
    

     

  • 在任何时候都要使用事务,即使是在读取、查询数据的时候,为什么呢?因为你不清楚数据库什么时候操作失败,如何恢复原来数据。而NHibernate中的事务(可以通过 tx.Rollback()方法),帮助我们完成这些事情。  

4. NHibernate并发控制

  • 悲观并发控制
  • 乐观并发控制(NHibernate支持)

5. NHibernate关系

  • NHibernate支持/定义的几种类型的集合:
    Bag:对象集合,每个元素可以重复。例如{1,2,2,6,0,0},在.Net中相当于IList或者IList<T>实现。
    Set:对象集合,每个元素必须唯一。例如{1,2,5,6},在.Net中相当于ISet或者ISet<T>实现,Iesi.Collections.dll程序集提供ISet集合。
    List:整数索引对象集合,每个元素可以重复。例如{{1,"YJingLee"},{2,"CnBlogs"},{3,"LiYongJing"}},在.Net中相当于ArraryList或者        List<T>实现。
    Map:键值对集合。例如{{"YJingLee",5},{"CnBlogs",7},{"LiYongJing",6}},在.Net中相当于HashTable或者IDictionary<Tkey,TValue>实现。
  • Customer与Order的一对多关系映射:
    Customer.cs
    using Iesi.Collections.Generic;
    
    namespace DomainModel.Entities
    {
        public class Customer
        {
            public virtual int CustomerId { get; set; }
            public virtual string Firstname { get; set; }
            public virtual string Lastname { get; set; }
            //一对多关系:Customer有一个或多个Orders
            public virtual ISet<Order> Orders { get; set; }
        }
    }
    

    Customer.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                       assembly="DomainModel" namespace="DomainModel">
    
      <class name ="DomainModel.Entities.Customer,DomainModel"
             table="Customer">
        <id name="CustomerId" column="CustomerId" type="Int32" 
            unsaved-value="0">
          <generator class ="native"></generator>
        </id>
        <property name="Firstname" column ="Firstname" type="string"
                  length="50" not-null="false"/>
        <property name ="Lastname" column="Lastname" type="string"
                  length="50" not-null="false"/>
        <!--一对多关系:Customer有一个或多个Orders-->
        <set name="Orders" table="`Order`" generic="true" inverse="true">
              <key column="Customer" foreign-key="FK_CustomerOrders"/>
              <one-to-many class="DomainModel.Entities.Order,DomainModel"/>
        </set>
      </class>
    </hibernate-mapping>
    

     

  • Customer与Order的一对多关系映射:
    Order.cs
    namespace DomainModel.Entities
    {
        public class Order
        {
            public virtual int OrderId { get; set; }
            public virtual DateTime OrderDate { get; set; }
            //多对一关系:Orders属于一个Customer
            public virtual Customer Customer { get; set; }
        }
    }
    

    Order.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                       assembly="DomainModel" namespace="DomainModel">
      
      <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" >
        <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0">
          <generator class="native" />
        </id>
        <property name="OrderDate" column="OrderDate" type="DateTime"
                  not-null="true" />
        <!--多对一关系:Orders属于一个Customer-->
        <many-to-one name="Customer" column="Customer" not-null="true"
                     class="DomainModel.Entities.Customer,DomainModel"
                     foreign-key="FK_CustomerOrders" />
      </class>
    </hibernate-mapping>
    

     

  • Order与Product的多对多关系映射:
    Order.cs
    namespace DomainModel.Entities
    {
        public class Order
        {
            public virtual int OrderId { get; set; }
            public virtual DateTime OrderDate { get; set; }
            //多对一关系:Orders属于一个Customer
             public virtual Customer Customer { get; set; }
            //多对多关系:Order有多个Products
             public virtual IList<Product> Products { get; set; }
        }
    }
    

    Order.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                       assembly="DomainModel" namespace="DomainModel">
      
      <class name="DomainModel.Entities.Order,DomainModel" table="`Order`" >
    
        <id name="OrderId" column="OrderId" type="Int32" unsaved-value="0">
          <generator class="native" />
        </id>
        <property name="OrderDate" column="OrderDate" type="DateTime" not-null="true" />
        <!--多对一关系:Orders属于一个Customer-->
        <many-to-one name="Customer" column="Customer" not-null="true"
                     class="DomainModel.Entities.Customer,DomainModel"
                     foreign-key="FK_CustomerOrders" />
        <!--多对多关系:Order有多个Products-->
        <bag name="Products" generic="true" table="OrderProduct">
             <key column="`Order`" foreign-key="FK_OrderProducts"/>
             <many-to-many column="Product" 
                        class ="DomainModel.Entities.Product,DomainModel" 
                        foreign-key="FK_ProductOrders"/>
        </bag>
      </class>
    </hibernate-mapping>
    

     

  • Order与Product的多对多关系映射
    Product.cs
    namespace DomainModel.Entities
    {
        public class Product
        {
            public virtual int ProductId { get; set; }
            public virtual string Name { get; set; }
            public virtual float Cost { get; set; }
            //多对多关系:Product属于多个Orders
            public virtual IList<Order> Orders { get; set; }
        }
    }
    

    Product.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
                       assembly="DomainModel" namespace="DomainModel">
      <class name="DomainModel.Entities.Product,DomainModel" table="Product">
        
        <id name="ProductId" column ="ProductId" type="Int32" unsaved-value="0">
          <generator class="native"/>
        </id>    
        <property name="Name" column="Name" type="string" not-null="true" length="50"/>
        <property name="Cost" column="Cost" type="float" not-null="true"/>
         <!--多对多关系:Product属于多个Orders-->
        <bag name="Orders" generic="true" table="OrderProduct">
            <key column="Product" foreign-key="FK_ProductOrders"/>
            <many-to-many column="`Order`" 
                        class="DomainModel.Entities.Order,DomainModel"
                        foreign-key="FK_OrderProducts"/>
        </bag>    
      </class>
    </hibernate-mapping>
    

     

6. NHibernate的加载机制

  • 延迟加载
    使用代理模式
  • 立即加载
    可选的lazy属性
    NHibernate提供的实用类
    HQL抓取策略

7. NHibernate中使用视图
  在NHibernate中使用视图,同表类似,只是属性访问权限不同罢了。视图是只读的,所以把属性的Setter设置为private访问权限。

8. NHibernate中使用存储过程
  

 

引自:http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html

抱歉!评论已关闭.