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;代码如下

Salary.cs
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属性:

User.cs
 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节点

User.hbm.xml
<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

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类

UserSalaryFixure.cs
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

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框架真是非常强大。今天先到这里。明天继续。
项目文件:/Files/jillzhang/simple2.rar

转载于:https://www.cnblogs.com/erichzhou/archive/2007/03/29/692949.html

Nhibernate学习起步之many-to-one篇(转)相关推荐

  1. nhibernate学习之集合组合依赖

    1.学习目标    还是学习compenent的用法,上节实现了简单字段的组合,这节中将讨论两个问题:1.依赖对象有一个指向容器对象的引用.2.集合依赖 2.开发环境和必要准备    开发环境为:wi ...

  2. NHibernate学习笔记(二):one-to-one关系映射

    上一篇:NHibernate学习笔记(一):初识NHibernate 本文的内容:1.介绍NH如何处理对象间one-to-ont的映射关系: 经验教训: 1.操作一对一关联关系中的一个对象时,得在程序 ...

  3. HTML小白起步(一、闲聊篇)

    HTML小白起步(一.闲聊篇)欢迎和我一起学习. 这是一篇很没有意思的文章,适合小白看看,大佬不喜勿喷. 很多是个人见解和一些整合,不具有权威性,如有错误请指出,谢谢各位! 个人不习惯那么散乱的文章, ...

  4. NHibernate快速起步

    NHibernate快速起步 注:本文中使用的是NH1.0.2版本,其他版本配置可能略有不同. 示例代码下载. 数据库脚本下载 一.体系结构 首先我们来看看NHibernate的体系结构: NHibe ...

  5. 99数据集预处理_深度学习在放射治疗的应用—工具篇(五)数据集构建

    家园宗旨:诚邀八方志同道合之友,共谋一隅传道受业之善! 作者简介: 本期我们将继续介绍Matlab中的数据集系列函数.上期中我们介绍了imageDatastore数据集函数,该函数能够实现深度学习所需 ...

  6. 学习动态性能表 第五篇--V$SESSION

    学习动态性能表 第五篇--V$SESSION  在本视图中,每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,LGWR,arcchiver等等. V$ ...

  7. 【NodeJs-5天学习】第四天存储篇④ ——基于MQTT的环境温度检测,升级存储为mysql

    [NodeJs-5天学习]第四天存储篇④ --基于MQTT的环境温度检测,升级存储为mysql 1. 前言 2. 服务器代码 2.1 配置MySQL服务器 2.2 NodeJs服务器代码 2.2.1 ...

  8. 离线强化学习(Offline RL)系列3: (算法篇) IQL(Implicit Q-learning)算法详解与实现

    [更新记录] 论文信息:Ilya Kostrikov, Ashvin Nair, Sergey Levine: "Offline Reinforcement Learning with Im ...

  9. 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)

    论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...

最新文章

  1. 企业网络推广——企业网络推广专员如何预估网站优化流量的增长?
  2. java使用类似ini文件IniProperties的类
  3. Ardino基础教程 6_抢答器
  4. inotify_add_watch使用注意
  5. 函数计算: 让小程序开发进入 Serverless 时代
  6. 使用SAP WebIDE往Github上推送代码修改时遇到错误消息 Commit request failed Commit failed. Ref must be HEAD and is HEAD
  7. MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
  8. 网络层(网际控制报文协议ICMP)
  9. 新手学vue还是react?
  10. iphone全部机型_5G旗舰坚果R2再出发 1亿像素拍照出彩领跑四千价位档|像素|华为mate|iphone|手机...
  11. 12.PHP-FPM
  12. Linux V4L2驱动框架分析之(一):架构介绍
  13. linux内核教学的全套视频,中科大Linux内核分析视频教程下载,共计23集
  14. ghpython_根据曲线曲率向量和切向量绘制椭圆
  15. 数据库事物,隔离级别慢慢深入
  16. 献给即将来临的母亲节父亲节!!
  17. Z05 - 033、访客分析 - 独立访客
  18. Cadence改背景色
  19. 宽带信号的DOA估计学习笔记(四):空间分辨率
  20. BootLoader 介绍 与 uboot 简介

热门文章

  1. GC 调优(实战篇) - GC参考手册
  2. django框架预备知识
  3. MySQL启动很慢的原因
  4. BZOJ3387栅栏行动
  5. Mybaitis JdbcType 和javaType
  6. 图文详解如何搭建Windows的Android C++开发环境
  7. 劳心者、劳力者或CEO、CTO各得其所,足矣
  8. 朴素贝叶斯和贝叶斯估计_贝叶斯估计收入增长的方法
  9. 逻辑回归 概率回归_概率规划的多逻辑回归
  10. leetcode994. 腐烂的橘子(bfs)