• Nhibernate学习起步之manytoone篇(转 明了篇)


    1.     学习目的:

    通过进一步学习nhibernate基础知识,在实现单表CRUD的基础上,实现两表之间one-to-many的关系.

    2.     开发环境+必要准备

    开发环境: windows 2003,Visual studio .Net 2005,Sql server 2005 developer edition

    必要准备: 学习上篇文章单表操作   

    3. 对上篇文章中部分解释

     1)在User.hbm.xml中class节点中有一个lazy的属性,这个属性用于指定是否需要延迟加载(lazy loading),在官方文档中称为:lazy fecting.可以说延迟加载是nhibernate最好的特点,因为它可以在父类中透明的加载子类集合,这对于many-to-one的业务逻辑中,真是方便极了。但是有些时候,父类是不需要携带子类信息的。这时候如果也加载,无疑对性能是一种损失。在映射文件的class节点中可以通过配置lazy属性来指定是否支持延迟加载,这就更灵活多了。 

     2) 在User.hbm.xml中generate节点,代表的是主键的生成方式,上个例子中的”native”根据底层数据库的能力选择identity,hilo,sequence中的一个,比如在MS Sql中,使我们最经常使用的自动增长字段,每次加1. 

    3) NHibernateHelper.cs中,创建Configuration对象的代码:new Configuration().Configure(@"E:\myproject\nhibernatestudy\simle1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml")因为我是在单元测试中调试,所以将绝对路径的配置文件传递给构造函数。如果在windows app或者web app可以不用传递该参数。 

    4. 实现步骤

     1)确定实现的业务需求:用户工资管理系统

     2) 打开上篇文章中的NHibernateStudy1解决方案。向项目NhibernateSample1添加类Salary;代码如下


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

    namespace NhibernateSample1
    {
        
    public partial class Salary
        
    {
            
    int _id;
            User _user;
            
    int _year;
            
    int _month;
            
    int _envy;
            
    decimal _money;
            
    /// <summary>
            
    /// 工资编号
            
    /// </summary>

            public virtual int Id
            
    {
                
    get
                
    {
                    
    return _id;
                }

                
    set
                
    {
                    _id 
    = value;
                }

            }

            
    /// <summary>
            
    /// 雇员
            
    /// </summary>

            public virtual User Employee
            
    {
                
    get
                
    {
                    
    return _user;
                }

                
    set
                
    {
                    _user 
    = value;
                }

            }

            
    /// <summary>
            
    /// 年度
            
    /// </summary>

            public int Year
            
    {
                
    get
                
    {
                    
    return _year;
                }

                
    set
                
    {
                    _year 
    = value;
                }

            }

            
    /// <summary>
            
    /// 月份
            
    /// </summary>

            public int Month
            
    {
                
    get
                
    {
                    
    return _month;
                }

                
    set
                
    {
                    _month 
    = value;
                }

            }

            
    /// <summary>
            
    /// 季度
            
    /// </summary>

            public int Envy
            
    {
                
    get
                
    {
                    
    return _envy;
                }

                
    set
                
    {
                    _envy 
    = value;
                }

            }

            
    /// <summary>
            
    /// 工资
            
    /// </summary>

            public decimal Money
            
    {
                
    get
                
    {
                    
    return _money;
                }

                
    set
                
    {
                    _money 
    = value;
                }

            }

        }

    }

    3) 更改User.cs,在User里面添加SalaryList属性:


     1private System.Collections.IList _salaryList;
     2 /// <summary>
     3        /// 工资列表
     4        /// </summary>

     5        public System.Collections.IList SalaryList
     6        {
     7            get
     8            {
     9                return _salaryList;
    10            }

    11            set
    12            {
    13                _salaryList = value;
    14            }

    15        }
    4)修改User.hbm.xml,加入bag节点

    <bag name="SalaryList" table="Salary" inverse="true" lazy="true" cascade="all">
          
    <key column="Id"/>
          
    <one-to-many class="NhibernateSample1.Salary,NhibernateSample1"></one-to-many>
        
    </bag>

     5)编写类Salary的映射文件:Salary.hbm.xml

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      
    <class name="NhibernateSample1.Salary,NhibernateSample1" table="Salary" lazy="false">
        
    <id name="Id" column="Id" unsaved-value="0">
          
    <generator class="native" />
        
    </id>
        
    <property name="Year" column="Year" type="Int32" not-null="true"></property>
        
    <property name="Month"  column="Month"  type="Int32" not-null="true"></property>
        
    <property name="Envy"  column="Envy"  type="Int32" not-null="true"></property>
        
    <property name="Money"  column="Money"  type="Decimal" not-null="true"></property>
        
    <many-to-one name="Employee" column="Uid" not-null="true"></many-to-one>
      
    </class>
    </hibernate-mapping>
    6)编写CRUD

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Collections;
    using NHibernate;
    using NHibernate.Cfg;
    using NHibernate.Tool.hbm2ddl;

    namespace NhibernateSample1
    {
        
    public  class UserSalaryFixure
        
    {
            
    private ISessionFactory _sessions; 
            
    public void Configure()
            
    {
                Configuration cfg 
    = GetConfiguration();      
                _sessions 
    = cfg.BuildSessionFactory();
            }

            Configuration GetConfiguration()
            
    {
                
    string cfgPath = @"E:\my project\nhibernate study\simle 1\NHibernateStudy1\NhibernateSample1\hibernate.cfg.xml";
                Configuration cfg 
    = new Configuration().Configure(cfgPath);
                
    return cfg;
            }

            
    public void ExportTables()
            
    {
                Configuration cfg 
    = GetConfiguration();           
                
    new SchemaExport(cfg).Create(truetrue);
            }

            
    public User CreateUser(String name,string pwd)
            
    {
                User u 
    = new User();
                u.Name 
    = name;
                u.Pwd 
    = pwd;
                u.SalaryList 
    = new ArrayList();

                ISession session 
    = _sessions.OpenSession();

                ITransaction tx 
    = null;

                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    session.Save(u);
                    tx.Commit();
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    throw e;
                }

                
    finally
                
    {
                    session.Close();
                }


                
    return u;
            }

            
    public Salary CreateSalary(User u, int year,int month,int envy,decimal money)
            
    {
                Salary item 
    = new Salary();
                item.Year 
    = year;
                item.Money 
    = money;
                item.Envy 
    = envy;
                item.Month 
    = month;
                item.Employee 
    = u;
                u.SalaryList.Add(item);
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;

                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    session.Update(u);
                    tx.Commit();
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    throw e;
                }

                
    finally
                
    {
                    session.Close();
                }

                
    return item;
            }

            
    public Salary CreateSalary(int uid,int year, int month, int envy, decimal money)
            
    {
                Salary item 
    = new Salary();
                item.Year 
    = year;
                item.Money 
    = money;
                item.Envy 
    = envy;
                item.Month 
    = month;
                
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;
                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    User u 
    = (User)session.Load(typeof(User), uid);
                    item.Employee 
    = u;
                    u.SalaryList.Add(item);
                    tx.Commit();
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    throw e;
                }

                
    finally
                
    {
                    session.Close();
                }

                
    return item;
            }

            
    public Salary GetSalary(int salaryID)
            
    {
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;
                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    Salary item 
    = (Salary)session.Load(typeof(Salary),
                        salaryID);               
                    tx.Commit();
                    
    return item;
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    return null;
                }

                
    finally
                
    {
                    session.Close();
                }

                
    return null;
            }

            
    public User GetUser(int uid)
            
    {
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;
                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    User item 
    = (User)session.Load(typeof(User),
                        uid);
                    tx.Commit();
                    
    return item;
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    return null;
                }

                
    finally
                
    {
                    session.Close();
                }

                
    return null;
            }

            
    public void UpdateSalary(int salaryID, decimal money)
            
    {
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;
                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    Salary item 
    = (Salary)session.Load(typeof(Salary),
                        salaryID);
                    item.Money 
    = money;
                    tx.Commit();
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    throw e;
                }

                
    finally
                
    {
                    session.Close();
                }

            }


            
    public void Delete(int uid)
            
    {
                ISession session 
    = _sessions.OpenSession();
                ITransaction tx 
    = null;
                
    try
                
    {
                    tx 
    = session.BeginTransaction();
                    Salary item 
    = session.Load(typeof(Salary), uid) as Salary; ;
                    session.Delete(item);
                    tx.Commit();
                }

                
    catch (HibernateException e)
                
    {
                    
    if (tx != null) tx.Rollback();
                    
    throw e;
                }

                
    finally
                
    {
                    session.Close();
                }

            }


        }

    }

    7) 编写单元测试类:UnitTest1.cs

    using System;
    using System.Text;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.UnitTesting;
    using NhibernateSample1;

    namespace TestProject1
    {
        
    /// <summary>
        
    /// UnitTest1 的摘要说明
        
    /// </summary>

        [TestClass]
        
    public class UnitTest1
        
    {
            
    public UnitTest1()
            
    {
                
    //
                
    // TODO: 在此处添加构造函数逻辑
                
    //
            }

            NhibernateSample1.UserSalaryFixure usf 
    = new UserSalaryFixure();
            
    其他测试属性

            [TestMethod]
            
    public void Test1()
            
    {
                usf.Configure();
                usf.ExportTables();
                User u 
    = usf.CreateUser(Guid.NewGuid().ToString(), "ds");
                Assert.IsTrue(u.Id
    >0);
                Salary s 
    = usf.CreateSalary(u, 200731, (decimal)8000.00);
                Assert.IsTrue(s.Id 
    > 0);
                Salary s1 
    = usf.CreateSalary(u.Id, 200731, (decimal)7500);
                Assert.IsTrue(s1.Id
    >0);
                usf.UpdateSalary(s1.Id, (
    decimal)6000);
                s1 
    = usf.GetSalary(s1.Id);
                Assert.IsTrue(s1.Money 
    == (decimal)6000);
                usf.Delete(s1.Id);
                s1 
    = usf.GetSalary(s1.Id);
                Assert.IsNull(s1);
                User u1 
    = usf.GetUser(1);
                Assert.IsTrue(u1.SalaryList.Count
    >0);
            }


        }

    }

    加载测试元数据,直到Test()通过。
    总结:通过进一步学习nhiberate,发现ORM框架真是非常强大。今天先到这里。明天继续。
  • 相关阅读:
    我最讨厌画图,这辈子我都不想再画图
    bzoj1218[HNOI2003]激光炸弹
    bzoj1196[HNOI2006]公路修建问题
    bzoj1588[HNOI2002]营业额统计
    bzoj2039[2009国家集训队]employ人员雇佣
    bzoj3874[Ahoi2014]宅男计划
    bzoj2282[Sdoi2011]消防
    bzoj1798[Ahoi2009]Seq 维护序列seq
    bzoj4003[JLOI2015]城池攻占
    bzoj2809[Apio2012]dispatching
  • 原文地址:https://www.cnblogs.com/kedach/p/1284251.html
Copyright © 2020-2023  润新知