最近在看李永京的NHibernate文章 "传送门",做了下DEMO。

后期借助这个DEMO 来加Spring.net 和MVC 以及购物车 做个总结,以便日后留用...NHibernate 学习20101103

 

 表两张 Customer、Order.  数据库 Oracle 10g   

  结构参考NHibernate 学习20101103

Customer XML配置:

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

<!--父表CustomerXML配置(Customer.hbm.xml) 对应Oracle里的表 CUSTOMER(全大写) -->

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
   assembly
="NHibernateSample.Domain"
   namespace
="NHibernateSample.Domain.Entities">
  
<!--父端路径:NHibernateSample.Domain.Entities.Customer...程序集:NHibernateSample.Domain...父端在数据库中对应的表名为CUSTOMER(全大写)-->
  
<class name ="NHibernateSample.Domain.Entities.Customer,NHibernateSample.Domain" table="CUSTOMER">
    
<!--父表的主键-->
    
<id name="Id" column ="CUSTOMERID">
      
<generator class ="assigned"/>
      
<!--非自增长assigned.Add的时候可自定义-->
    
</id>
    
<!--assigned-->
    
<!--类Customer中Firstname字段对应数据库Customer表中的FIRSTNAME字段-->
    
<property name ="Firstname" column ="FIRSTNAME"  />
    
<property name ="Lastname" column ="LASTNAME" />
    
    
<!--Relationship : 1:n One customer have many orders-->
    
<!--映射一对多<set> (在父端映射)
      <set>标签中:name为Orders类的名称,table可写可不写,如果写的话应该分下面两种:
      第一种让NHibernate自动判断,可以写为:table="Order" or table="ORDER" 其中" "中的大小写可以随便写。注:(Oracle中的Order表命名为:Order)
      第二种就是关键字处理 在Oracle中可用table="`Order`" SQL2005中为table="[Order]"。
      
-->
    
<set name="Orders" table="`Order`" generic="true" inverse="true">
      
<!--这个key 应该就是Order表中的CUSTOMERID(外键)-->
      
<key column="CUSTOMERID"></key>
      
<!--标示一对多 子端Orders类的路径以及程序集-->
      
<one-to-many class="NHibernateSample.Domain.Entities.Order,NHibernateSample.Domain"/>
    
</set>
    
<!-- 结束 ^_^-->
  
</class>
</hibernate-mapping>

 

Order XML配置:

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

<!--子表Order配置(Order.hbm.xml) 对应Oracle里的表 Order (有大有小写)-->

<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
   assembly
="NHibernateSample.Domain"
   namespace
="NHibernateSample.Domain.Mappings">

  
<!--子端路径:NHibernateSample.Domain.Entities.Order...程序集:NHibernateSample.Domain...子端在数据库中对应的表名为Order(有大有小写)-->
  
<class name ="NHibernateSample.Domain.Entities.Order,NHibernateSample.Domain" table="`Order`">
    
<!--子表主键-->
    
<id name ="OrderID" column="ORDERID">
      
<generator class ="assigned"/>
      
<!--非自增长assigned.  Add的时候可自定义-->
    
</id>
    
<!--类Order中OrderDate字段对应数据库Order表中的ORDERDATE字段-->
    
<property name="OrderDate" column="ORDERDATE"></property>
    
<!--映射多对一,many-to-one (在子端映射) 
    name为父端的类名,column为父端类对应的表中的主键.(即表CUSTOMER中的CUSTOMERID
    Class 为父端类(Customer)的路径
-->
    
<many-to-one name="Customer" column="CUSTOMERID" 
                 class
="NHibernateSample.Domain.Entities.Customer,NHibernateSample.Domain" foreign-key="FK_CustomerOrders">
    
</many-to-one>
  
</class>
  
<!-- 结束 ^_^-->
</hibernate-mapping>


 Customer类.

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

using Iesi.Collections.Generic;

namespace NHibernateSample.Domain.Entities
{
    
//父端类Customer 对用Oracle 中的CUSTOMER
    public class Customer
    {
        
//CUSTOMER表中的字段
        public virtual int Id { getset; }
        
public virtual string Firstname { getset; }
        
public virtual string Lastname { getset; }
        
//由于CUSTOMER与Order是Many to one 所以用Iset<T>集合来表示多个Orders
        
//详情参考http://www.cnblogs.com/lyj/archive/2008/10/24/1319052.html
        public virtual ISet<Order> Orders { getset; }
    }
}

Order类

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

namespace NHibernateSample.Domain.Entities
{
    
//父端类Order 对用Oracle 中的Order
    public class Order
    {
        
//Order表中对应的字段
        public virtual int OrderID { getset; }
        
public virtual DateTime OrderDate { getset; }

        
//由于Order与CUSTOMER是one to many 所以用一个Customer来表示
        public virtual Customer Customer { getset; }
    }
}


NhibernateCriteria.cs  与Oracle进行交互

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

using NHibernateSample.Domain.Entities;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Criterion.Lambda;

namespace NHibernateSample.Data
{
    
public class NhibernateCriteria
    {
        
public NhibernateCriteria()
        {
            NHibernateHelper Hhelp 
= new NHibernateHelper();
            
this.Session = Hhelp.GetSession();
        }
        
protected ISession Session { getset; }
        
public NhibernateCriteria(ISession session)
        {
            Session 
= session;
        }
        
public IList<Customer> UseCriteriaAPI_GetCustomersWithOrders()
        {
            DateTime dtime 
= new DateTime(1989101);
            
return Session.CreateCriteria(typeof(Customer))
            .CreateAlias(
"Orders""o")
            .Add(Restrictions.Gt(
"o.OrderDate", dtime))
            .List
<Customer>();
            
        }
    }
}

相关文章:

  • 2021-11-08
  • 2021-10-05
  • 2021-05-27
  • 2022-12-23
  • 2021-07-09
  • 2021-10-02
  • 2021-12-06
猜你喜欢
  • 2021-07-29
  • 2022-02-13
  • 2022-01-22
  • 2021-06-09
相关资源
相似解决方案