科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道Nhibernate学习起步之many-to-one篇

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

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

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

作者:ghost 来源:CSDN 2007年9月24日

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

 2) User.hbm.xmlgenerate节点,代表的是主键的生成方式,上个例子中的”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>

学习目的:
 

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1733321

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章