Nhibernate学习起步之many-to-one篇(转)
通过进一步学习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(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框架真是非常强大。今天先到这里。明天继续。
项目文件:/Files/jillzhang/simple2.rar
转载于:https://www.cnblogs.com/erichzhou/archive/2007/03/29/692949.html
Nhibernate学习起步之many-to-one篇(转)相关推荐
- nhibernate学习之集合组合依赖
1.学习目标 还是学习compenent的用法,上节实现了简单字段的组合,这节中将讨论两个问题:1.依赖对象有一个指向容器对象的引用.2.集合依赖 2.开发环境和必要准备 开发环境为:wi ...
- NHibernate学习笔记(二):one-to-one关系映射
上一篇:NHibernate学习笔记(一):初识NHibernate 本文的内容:1.介绍NH如何处理对象间one-to-ont的映射关系: 经验教训: 1.操作一对一关联关系中的一个对象时,得在程序 ...
- HTML小白起步(一、闲聊篇)
HTML小白起步(一.闲聊篇)欢迎和我一起学习. 这是一篇很没有意思的文章,适合小白看看,大佬不喜勿喷. 很多是个人见解和一些整合,不具有权威性,如有错误请指出,谢谢各位! 个人不习惯那么散乱的文章, ...
- NHibernate快速起步
NHibernate快速起步 注:本文中使用的是NH1.0.2版本,其他版本配置可能略有不同. 示例代码下载. 数据库脚本下载 一.体系结构 首先我们来看看NHibernate的体系结构: NHibe ...
- 99数据集预处理_深度学习在放射治疗的应用—工具篇(五)数据集构建
家园宗旨:诚邀八方志同道合之友,共谋一隅传道受业之善! 作者简介: 本期我们将继续介绍Matlab中的数据集系列函数.上期中我们介绍了imageDatastore数据集函数,该函数能够实现深度学习所需 ...
- 学习动态性能表 第五篇--V$SESSION
学习动态性能表 第五篇--V$SESSION 在本视图中,每一个连接到数据库实例中的session都拥有一条记录.包括用户session及后台进程如DBWR,LGWR,arcchiver等等. V$ ...
- 【NodeJs-5天学习】第四天存储篇④ ——基于MQTT的环境温度检测,升级存储为mysql
[NodeJs-5天学习]第四天存储篇④ --基于MQTT的环境温度检测,升级存储为mysql 1. 前言 2. 服务器代码 2.1 配置MySQL服务器 2.2 NodeJs服务器代码 2.2.1 ...
- 离线强化学习(Offline RL)系列3: (算法篇) IQL(Implicit Q-learning)算法详解与实现
[更新记录] 论文信息:Ilya Kostrikov, Ashvin Nair, Sergey Levine: "Offline Reinforcement Learning with Im ...
- 离线强化学习(Offline RL)系列3: (算法篇)策略约束 - BRAC算法原理详解与实现(经验篇)
论文原文:[Yifan Wu, George Tucker, Ofir Nachum: "Behavior Regularized Offline Reinforcement Learnin ...
最新文章
- 企业网络推广——企业网络推广专员如何预估网站优化流量的增长?
- java使用类似ini文件IniProperties的类
- Ardino基础教程 6_抢答器
- inotify_add_watch使用注意
- 函数计算: 让小程序开发进入 Serverless 时代
- 使用SAP WebIDE往Github上推送代码修改时遇到错误消息 Commit request failed Commit failed. Ref must be HEAD and is HEAD
- MySQL基本的SELECT语句,SQL语言概述,基础和重要不冲突,完整详细可收藏
- 网络层(网际控制报文协议ICMP)
- 新手学vue还是react?
- iphone全部机型_5G旗舰坚果R2再出发 1亿像素拍照出彩领跑四千价位档|像素|华为mate|iphone|手机...
- 12.PHP-FPM
- Linux V4L2驱动框架分析之(一):架构介绍
- linux内核教学的全套视频,中科大Linux内核分析视频教程下载,共计23集
- ghpython_根据曲线曲率向量和切向量绘制椭圆
- 数据库事物,隔离级别慢慢深入
- 献给即将来临的母亲节父亲节!!
- Z05 - 033、访客分析 - 独立访客
- Cadence改背景色
- 宽带信号的DOA估计学习笔记(四):空间分辨率
- BootLoader 介绍 与 uboot 简介