惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Full Disclosure
WordPress大学
WordPress大学
小众软件
小众软件
Cloudbric
Cloudbric
AWS News Blog
AWS News Blog
腾讯CDC
量子位
人人都是产品经理
人人都是产品经理
大猫的无限游戏
大猫的无限游戏
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
V
Vulnerabilities – Threatpost
Scott Helme
Scott Helme
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
C
CXSECURITY Database RSS Feed - CXSecurity.com
The Hacker News
The Hacker News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
IT之家
IT之家
Jina AI
Jina AI
Attack and Defense Labs
Attack and Defense Labs
S
SegmentFault 最新的问题
Simon Willison's Weblog
Simon Willison's Weblog
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
T
Tailwind CSS Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
Google Online Security Blog
Google Online Security Blog
美团技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
罗磊的独立博客
L
LINUX DO - 最新话题
博客园 - Franky
博客园 - 叶小钗
Apple Machine Learning Research
Apple Machine Learning Research
The Last Watchdog
The Last Watchdog
J
Java Code Geeks
AI
AI
C
Cisco Blogs
酷 壳 – CoolShell
酷 壳 – CoolShell
C
Cyber Attacks, Cyber Crime and Cyber Security
Cisco Talos Blog
Cisco Talos Blog
博客园 - 三生石上(FineUI控件)
雷峰网
雷峰网
Help Net Security
Help Net Security
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
I
Intezer
S
Securelist

博客园 - YFeng_Lee

webHttpBinding+wsHttpBinding+basicHttpBinding的区别 (转) AppDomain对于静态对象的独享引用 AppDomain 详解(转) .net工具 InstallShield12 添加自定义对话框,并根据输入值修改对应的Config文件。 普通管理类程序开发之难度系数、层次之说法(转自csdn) 待阅读书目 C#开发Windows Service程序 创建一个windows service应用程序 Ext简介(转) Ext的组件结构分析(转) XML与数据库 分析模式 - 责任模式 NHibernate Cascades: the different between all, all-delete-orphans and save-update 企业开发框架NHibernate和Spring.Net简介-4 企业开发框架NHibernate和Spring.Net简介-3 企业开发框架NHibernate和Spring.Net简介-2 企业开发框架NHibernate和Spring.Net简介-1 Nhibernate学习之many-to-many篇(转 明了篇)
Nhibernate学习起步之many-to-one篇(转 明了篇)
YFeng_Lee · 2008-09-04 · via 博客园 - YFeng_Lee

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框架真是非常强大。今天先到这里。明天继续。