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

1.     学习目的:

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

2.     开发环境+必要准备

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

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

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

Salary.cs

3) 更改User.cs,User里面添加SalaryList属性:

User.cs
4)修改User.hbm.xml,加入bag节点
User.hbm.xml

 5)编写类Salary的映射文件:Salary.hbm.xml
Salary.hbm.xml
6)编写CRUD
UserSalaryFixure.cs
7) 编写单元测试类:UnitTest1.cs
UnitTest1.cs
加载测试元数据,直到Test()通过。
总结:通过进一步学习nhiberate,发现ORM框架真是非常强大。今天先到这里。明天继续。
项目文件:/Files/jillzhang/simple2.rar
作者:jillzhang
出处:http://jillzhang.cnblogs.com/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
posted @ 2007-03-23 00:12 Robin Zhang 阅读(7274) 评论(13)  编辑 收藏 网摘 所属分类: ORM

  回复  引用  查看    
#1楼2007-03-23 11:55 | 金色海洋(jyk)      
这些代码是要每一个表都写一遍吗?
还是一个项目写一遍?
(编写单元测试类除外)

不了解Nhibernate的人的弱弱的问一句。

  回复  引用  查看    
#2楼[楼主]2007-03-23 13:34 | jillzhang      
@金色海洋(jyk)
映射文件可以代码生成。配置文件只需一次

  回复  引用    
#3楼2007-03-23 16:41 | duhaha[未注册用户]
http://*** 让你创意的网站
  回复  引用    
#4楼2007-03-24 11:04 | 亚历山大同志
从父类导航到子类的时候就算延迟加载,但是如果子类列表很庞大的话还是面临性能的危机,比如父类是帖子分类,子类是帖子,如果不分页,就算延迟加载了,还是要加载这么多东西,如果在配制里就写死过滤那么又不灵活了.
  回复  引用  查看    
#5楼2007-04-11 16:29 | Bryant      
<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>
这个报错
大哥帮看看

  回复  引用    
#6楼2007-04-27 20:42 | JAMES[未注册用户]
HibernateException 和Exception有什么区别
不错,支持一下
  回复  引用    
#8楼2008-01-21 17:25 | zj[未注册用户]
貌似bag节点的lazy属性应该为false,test才能通过。
  回复  引用  查看    
#9楼2008-08-03 20:18 | 木独猪      
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;
}

此方法中 tx = session.BeginTransaction();
session.Update(u);
tx.Commit();
用Update(u)测试不能通过,Update方法应该是更新,没有新建功能。不知何原因?


  回复  引用  查看    
#10楼2008-09-07 09:47 | StephenJu      
public void UpdateSalary(int salaryID, decimal money)
此方法里少了session.Save(u);
笔误,呵呵~~




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 684567




相关文章:

相关链接: