Nhibernate学习起步之many-to-one篇

1.     

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

2.     开发环境+必要准备

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

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

3) 更改User.cs,在User里面添加SalaryList属性:4)修改User.hbm.xml,加入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(true, true);
        }
        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();
        其他测试属性#region 其他测试属性
        //
        // 您可以在编写测试时使用下列其他属性:
        //
        // 在运行类中的第一个测试之前使用 ClassInitialize 运行代码
        // [ClassInitialize()]
        // public static void MyClassInitialize(TestContext testContext) { }
        //
        // 在类中的所有测试都已运行之后使用 ClassCleanup 运行代码
        // [ClassCleanup()]
        // public static void MyClassCleanup() { }
        //
        // 在运行每个测试之前使用 TestInitialize 运行代码 
        // [TestInitialize()]
        // public void MyTestInitialize() { }
        //
        // 在运行每个测试之后使用 TestCleanup 运行代码
        // [TestCleanup()]
        // public void MyTestCleanup() { }
        //
        #endregion

        [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, 2007, 3, 1, (decimal)8000.00);
            Assert.IsTrue(s.Id > 0);
            Salary s1 = usf.CreateSalary(u.Id, 2007, 3, 1, (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框架真是非常强大。今天先到这里。明天继续。

 

private System.Collections.IList _salaryList;
/**//// <summary>
/// 工资列表
/// </summary>
public System.Collections.IList SalaryList
{
    get
    {
        return _salaryList;
    }
    set
    {
        _salaryList = value;
    }
}

 

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;
            }
        }
    }
}

<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>

学习目的:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值